登陆

怎么运用Mybatis的拦截器完成数据加密与解密?

admin 2019-09-27 315人围观 ,发现0个评论

快,重视米兜Java,一同涨姿态~

热门引荐

怎样运用Mybatis的拦截器完成数据加密与解密?

01前语

最近国家强抓用户隐私,因而许多公司开端做数据加减密改造,那由于mybatis供给也供给了插件这个扩展,许多的思路便是在插件上做文章,在github上也的确有这样的库房。

  • 根据Executor:
  • https://github.com/miaoxinwei/mybatis-crypt
  • 根据StatementHandler:
  • https://github.com/ikchan/mybatis-plugin-cryptogram

02正文

这两个别离是根据Executor和StatementHandler做的插件,这儿不介绍怎样完成一个mybatis插件,有爱好的能够看下官网。

mybatis插件plugins demo:

http://www.mybatis.org/mybatis-3/zh/configuration.html#plugins


别离能够对以下4种状况就行扩展:

  1. ParameterHandler (getParameterObject, setParameters),aop setParameters是不可的,由于这时现已完成了sql解析,某些取值现已不会再经过原始的parameter取值。比方:假如时foreach标签,在此时会通boundSql.getAdditionalParameter获取
  2. StatementHandler (prepare, parameterize, batch, update, query),这儿也是做不了的,由于现已失去了特点注解相关的信息
  3. ResultSetHandler (handleResultSets, handleOutputParameters) 这个能够做成果集解密。
  4. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 这个当然是能够的,他便是查询的出入口


所以在对数据做加减密的插件时,挑选对Ex怎么运用Mybatis的拦截器完成数据加密与解密?ecutor做。

这儿就完成怎么运用Mybatis的拦截器完成数据加密与解密?一个根据Executor的Interceptor。在看到上面根据Executor完成时分,总感觉有些别扭,

一是没有将办法元数据与加解密分隔,二是太多if else判别在做加解密流程中。

新的完成将intercept办法分为以下4步

public Object intercept(Invocation invocation) throws Throwab怎么运用Mybatis的拦截器完成数据加密与解密?le {

Object[] args = invocation.getArgs();

// 1.获取办法加解密 元数据

MethodCryptMetadata methodCryptMetadata = getCachedMethodCryptMetaData((MappedStatement) args[0]);

// 2.加密

args[1] = methodCryptMetadata.encrypt(args[1]);

// 3.履行sql

Object returnValue = invocation.proceed();

// 4.解密

return methodCryptMetadata.decrypt(returnValue);

}

特别阐明

  1. encryptWithOutAnnotation,decryptWithOutAnnotation能够经过插件properties修正
  2. 代码中XXX符号的是特别阐明
  3. 关于bean的加密,会涉及到原目标的修正,代码中经过clone防止
  4. 为防止多处对null值就行判别,handler和executor等都加了Null的完成
  5. MethodMetadata中的两个Resolver可能有必定的过度规划的嫌疑,首要是为了削减if else判别


03最终

类图、序列图:



详细完成可见源码:

https://github.com/StarskyBoy/mybatis-crypt


END!

请留下你指尖的温度

让太阳拥抱你

记住这是一个有温度的头条号

米兜Java

print_r('点个好看吧!');

var_dump('点个好看吧!');

NSLog(@"点个好看吧!");

System.out.println("点个好看吧!");

console.log("点个好看吧!");

print("点个好看吧!");

printf("点个好看吧!\n");

cout << "点个好看吧!" << endl;

Console.WriteLine("点个好看吧!");

fmt.Println("点个好看吧!");

Response.Write("点个好看吧!");

alert("点个好看吧!")

echo "点个好看吧!"

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP