2019独角兽企业重金招聘Python工程师标准>>>

软件版本

  • idea 2017.2
  • mybatis:3.2.8
  • java version "1.8.0_51"

common-config/src/main/resources/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 省略若干配置 --><!-- 插件配置 --><plugins><plugin interceptor="com.rd.ifaes.common.orm.interceptor.PaginationInterceptor" /><!-- 下面两个是我添加的 --><plugin interceptor="com.rd.ifaes.core.core.interceptor.UpdateInterceptor"/><plugin interceptor="com.rd.ifaes.core.core.interceptor.ResultInterceptor"/></plugins>
</configuration>

core/src/main/java/com/rd/ifaes/core/core/interceptor/ResultInterceptor.java

package com.rd.ifaes.core.core.interceptor;import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;import com.rd.ifaes.common.util.StringUtils;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;import com.rd.ifaes.common.orm.interceptor.BaseInterceptor;
import com.rd.ifaes.common.util.ReflectionUtils;
import com.rd.ifaes.common.util.AESUtils;
import com.rd.ifaes.core.user.domain.UserCache;/*** Mybatis 拦截组件* @author leeyi* @version V1.0, 2018-01-10 11:16:20*/
@Intercepts(
{@Signature(method = "handleResultSets", type = ResultSetHandler.class, args = {Statement.class})}
)
public class ResultInterceptor extends BaseInterceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object returnValue = invocation.proceed();if (returnValue instanceof ArrayList<?>) {List<?> list = (ArrayList<?>)returnValue;for(Object obj: list){if (obj instanceof UserCache) {// 查询UserCache结果解密处理dealUserCacheReturnValue(obj);}}}return returnValue;}/*** 查询UserCache结果解密处理*/private void dealUserCacheReturnValue(Object obj) {UserCache userCache = (UserCache)obj;// 这里只处理 addressString address = (String) ReflectionUtils.getFieldValue(obj, "address");userCache.setAddress(AESUtils.decryptForUsercache(address));// 这里只处理 idNoString idNo = (String) ReflectionUtils.getFieldValue(obj, "idNo");userCache.setIdNo(AESUtils.decryptForUsercache(idNo));}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {System.out.println(properties.getProperty("databaseType"));}
}

core/src/main/java/com/rd/ifaes/core/core/interceptor/UpdateInterceptor.java

package com.rd.ifaes.core.core.interceptor;import java.util.Properties;
import java.util.logging.Logger;import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;import com.rd.ifaes.common.orm.interceptor.BaseInterceptor;
import com.rd.ifaes.common.util.ReflectionUtils;
import com.rd.ifaes.common.util.PropertiesUtils;
import com.rd.ifaes.common.util.AESUtils;
import com.rd.ifaes.core.user.domain.UserCache;/*** Mybatis 拦截组件* @author leeyi* @version V1.0, 2018-01-10 11:16:20*/@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class UpdateInterceptor extends BaseInterceptor {private final Logger logger = Logger.getLogger(String.valueOf(this.getClass()));private static final long serialVersionUID = 1L;private Object parameter;@Overridepublic Object intercept(Invocation invocation) throws Throwable {final MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];//拦截需要的SQLparameter = invocation.getArgs()[1];BoundSql boundSql = mappedStatement.getBoundSql(parameter);// 这里只捕获 UserCache 其他 类型的不处理if (parameter instanceof UserCache) {Object obj = boundSql.getParameterObject();// UserCache 加密处理dealUserCacheValue(obj);}return invocation.proceed();}/***  UserCache 加密处理*/private void dealUserCacheValue(Object obj) {UserCache userCache = (UserCache)parameter;// 这里只处理 addressString address = (String) ReflectionUtils.getFieldValue(obj, "address");userCache.setAddress(AESUtils.encryptForUsercache(address));// 这里只处理 id_noString idNo = (String) ReflectionUtils.getFieldValue(obj, "idNo");userCache.setIdNo(AESUtils.encryptForUsercache(idNo));}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {super.initProperties(properties);}
}

common-supports/src/main/java/com/rd/ifaes/common/util/AESUtils.java

package com.rd.ifaes.common.util;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import com.rd.ifaes.common.util.PropertiesUtils;public class AESUtils {protected static String thisiv = "abc2030405060708";// iv 必须要是一个16为的字符串public static void setIv(String iv) {thisiv =  iv;}/*** 加密* @method encrypt* @param strIn   需要加密的内容* @param strKey  加密密码* @return* @throws* @since v1.0*/public static String encrypt(String strKey, String strIn) throws Exception {SecretKeySpec skeySpec = getKey(strKey);Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");IvParameterSpec iv = new IvParameterSpec(thisiv.getBytes());cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);byte[] encrypted = cipher.doFinal(strIn.getBytes());return new BASE64Encoder().encode(encrypted);}/*** 解密* @method decrypt* @param strIn   待解密内容* @param strKey  解密密钥* @return* @throws* @since v1.0*/public static String decrypt(String strKey, String strIn) throws Exception {SecretKeySpec skeySpec = getKey(strKey);Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");IvParameterSpec iv = new IvParameterSpec(thisiv.getBytes());cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);byte[] encrypted1 = new BASE64Decoder().decodeBuffer(strIn);byte[] original = cipher.doFinal(encrypted1);String originalString = new String(original);return originalString;}/*** 将二进制转换成16进制* @method parseByte2HexStr* @param buf* @return* @throws* @since v1.0*/private static String parseByte2HexStr(byte buf[]){StringBuffer sb = new StringBuffer();for(int i = 0; i < buf.length; i++){String hex = Integer.toHexString(buf[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sb.append(hex.toUpperCase());}return sb.toString();}/*** 转换密钥<br>** @param strKey* @return* @throws Exception*/private static SecretKeySpec getKey(String strKey) throws Exception {byte[] arrBTmp = strKey.getBytes();byte[] arrB = new byte[16]; // 创建一个空的16位字节数组(默认值为0)for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {arrB[i] = arrBTmp[i];}SecretKeySpec skeySpec = new SecretKeySpec(arrB, "AES");return skeySpec;}/*** 在获取数据之前给数据解密 解密没有成功的话,返回原来的值* @param  param 需要加密的內容* @return       解密后的字符串*/public static String decryptForUsercache(String param) {if (param == null || param.length() == 0) {return "";}if (param.length() < 4) {return param;}String prefix = param.substring(0,4);// 表示没有加密if (!prefix.equals("aes:")) {return param;}try {final String key = PropertiesUtils.getValue("user_aes_encrypt_key");String ciphertext = param.substring(4);String plaintext  = AESUtils.decrypt(key, ciphertext);param = plaintext;} catch(Exception e) {}return param;}/*** 在更新数据之前给数据加密* @param  param 需要界面的內容* @return       以 "aes:"开头的字符串*/public static String encryptForUsercache(String param) {if (param == null || param.length() == 0) {return "";}if (param.length() < 4) {return param;}String prefix = param.substring(0,4);// 表示已经加密过了if (prefix.equals("aes:")) {return param;}try {final String key = PropertiesUtils.getValue("user_aes_encrypt_key");param = "aes:" +  AESUtils.encrypt(key, param);} catch(Exception e) {}return param;}public static void main(String[] args) throws Exception {String Code = "abcd";// String key = "1q2w3e4r*?";// String key = "1q2w3e4rei1q2w3e4rei";String key = "a3aMbVs6e6t2Ucy7";String codE, codePhp, codeObjc;AESUtils.setIv("abc2030405060708");codE = AESUtils.encrypt(key, Code);codePhp = "u6qq89cZALmD+1PX6dXRgA==";codeObjc = "MSVbpcJlzq/HqcpSoHA4SA==";System.out.println("原文:" + Code);System.out.println("密钥:" + key);System.out.println("密文:" + codE);System.out.println("解密java:" + AESUtils.decrypt(key, codE));//System.out.println("解密php:" + AESUtils.decrypt(key, codePhp));//System.out.println("解密objc:" + AESUtils.decrypt(key, codeObjc));String address = "aes:peN5NYRurQT0deSQZ/SHwg==";String plaintext  = AESUtils.decrypt("a3aMbVs6e6t2Ucy7", address.substring(4));System.out.println("ddd:  " + plaintext);//String con2 = "5CxL+rE6Gh/zKPcffYExDg==";//System.out.println("解密objc:" + AESUtils.decrypt(key, con2));// String res = webview.postUrl("http://127.0.0.1:80","data=dhfakjsdfhksdhf+dfasjkdhf+adsfkhasld");// System.out.println("webview文:" + res);}
}

转载于:https://my.oschina.net/leeyisoft/blog/1605184

基于mybatis Interceptor的对 user_cache 表 address id_no 两个字段的加密解密;相关推荐

  1. 分表需要解决的问题 基于MyBatis 的轻量分表落地方案

    分表:垂直拆分.水平拆分 垂直拆分:根据业务将一个表拆分为多个表. 如:将经常和不常访问的字段拆分至不同的表中.由于与业务关系密切,目前的分库分表产品均使用水平拆分方式. 水平拆分:根据分片算法将一个 ...

  2. mysql 查询两个字段相同的数据_sql语句如何查询一个表中某两个字段的相同数据?...

    查询一个表中某两个字段的相同数据代码是:Select Name,ID From A group by Name,ID having count (*)>1. 结构化查询语言(Structured ...

  3. 基于 MyBatis 手撸一个分表插件

    背景 事情是酱紫的,上级leader负责记录信息的业务,每日预估数据量是15万左右,所以引入sharding-jdbc做分表. 上级leader完成业务的开发后,走了一波自测,git push后,就忙 ...

  4. list mybatis 接收 类型_基于mybatis拦截器实现的一款简易影子表自动切换插件

    近期因工作需要,小编基于mybatis拦截器开发了一款简易影子表自动切换插件,可以根据配置实现动态修改表名,即将对原source table表的操作自动切换到对target table表的操作.该插件 ...

  5. java使用mybatis拦截器对数据库敏感字段进行加密存储并解密

    记录业务中遇到的使用场景:灵活对数据库敏感字段进行加密和解密 文章目录 前言 一.创建数据库表和实体类 二.Mapper.Service.Controller等 三.自定义注解 四.加密工具类 五.参 ...

  6. thinkphp where 查询比较相同一个表中两个字段值

    $where['status'] = array('eq',2);$Bills = D("order");$list = $Bills->where($where)-> ...

  7. 基于mybatis拦截器实现数据权限

    数据权限是很多系统常见的功能,实现的方式也是很多的,最近在做项目的时候,自己基于mybatis拦截器做了一个数据权限的功能. **功能设计 a)  需要做数据权限功能的表加上一个权限id字段. 权限i ...

  8. MySQL查询多表定义实体类_自己设计一个 JAVA + MyBatis 解析实体类多表通用查询

    先来处理一下查询的字段和用到的表吧 //虽然我们使用的时候是实体,但最终还是要解析成sql的,那么我们需要想好解析成sql 时候所用到的东东,提前准备好 class TableEntity { Str ...

  9. springboot基于mybatis扫描jar包中的controller、service、dao、xml

    springboot基于mybatis扫描jar包中的controller.service.dao.xml 最近有这样的需求,是将某个业务模块接口,比如新闻的接口模块 作为一个公共固定的模块,整个包括 ...

最新文章

  1. 普加甘特图集成到第三方JS框架(MiniUI、jQuery、Ext等)
  2. shell脚本--02循环与条件
  3. WCF 第十三章 可编程站点 所有都与URI相关
  4. 查看redis缓存大小_一个 bug 引发了服务器崩溃,对应 redis 的 key 回收原理你清楚了吗?...
  5. 无法启动此程序,因为计算机中丢失msvcrtd.dll,Win7打开剑灵提示“丢失d3dx10_43.dll、MSVCRTD.dll文件”怎么办?...
  6. 羊皮卷的实践-第二十五章
  7. Elasticsearch对垒8大竞品技术
  8. table.render加入php传值,iView中Table通过render添加一个Input如何双向绑定数据
  9. Java类类getPackage()方法及示例
  10. 读取kaf卡数据_墨菊居然能秒开机秒读数据!Lexar雷克沙1667x UHS-II存储卡体验
  11. 蓝宝石显卡bios_狼神矿卡烤机89°C!强刷蓝宝石RX570超白金显卡BIOS降温75°教程...
  12. 一封 Cloud Native 的来信……
  13. 实用供热空调设计手册第三版_【最新资讯】执行主编周敏赴北京、天津进行手册编制工作会谈...
  14. Linux双网卡下的网络故障排查
  15. 因子分析spss怎么做 spss因子分析教程及结果解释
  16. matlab 正负数,matlab 开根号如何同时取到正负值
  17. 一:计算机基础入门及介绍
  18. 查看windows office是否激活
  19. java 截图_Java实现网页截屏
  20. 最新年龄估计综述(Deep learning approach for facial age classification: a survey of the state of the art)

热门文章

  1. JavaScript中的原型和继承
  2. 【dp】CF17C. Balance
  3. 高速pcb设计指南 1~8
  4. [转]CPoint+CSize+CRect学习大纲
  5. 蓝桥杯第八届省赛JAVA真题----9数算式
  6. java获取panel面板画笔_java - paintComponent()与paint()和JPanel vs Canvas在画笔类型的GUI中 - 堆栈内存溢出...
  7. html实现牌匾效果,4款店面牌匾设计效果图 店铺门头亚克力牌匾样式制作设计图...
  8. html5中音频、视频标签、自定义播放器常用属性及方法、全屏操作、新增属性兼容问题
  9. O2O休闲零食品类白皮书
  10. 这个副业清单,总有一个适合你!