mysql防注入插件_Mybatis自定义拦截器插件内注入的bean为空

背景

在实习工作时,部门在完善安全工具中间件来加固项目,其中就有包括基于Mybatis拦截器实现数据脱敏的工具

工作原理如图:d0de2bf7565ce90345bec94590607a12.png

问题

在调用时加密敏感数据时发现报空指针异常,经Debug发现为注入的EncryptManager为空

拦截器部分代码@Intercepts({

@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),

@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),

@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})

})

@Component

@Slf4j

public class DbInterceptor implements Interceptor {

@Autowired

private EncryptManager encryptManager; //加密实现类

原因

Mybatis的插件先于spring容器的完全初始化,虽然加了@Component会被扫描加入容器管理,但是此时Mybatis的拦截器DbInterceptor注入的对象EncryptManager是还未初始化到容器的。

所以通过这种方式拿到的bean为空。

解决

在执行拦截方法时从Spring容器获取bean

(无需另外再写初始化类实现InitializingBean接口的afterPropertiesSet()方法以后置的方式向Mybatis拦截器设置bean)@Override

public Object intercept(Invocation invocation) throws Throwable {

if(ApolloConfigManager.isCrypticSwitch())//通过apollo配置是否开启拦截器

{

if(encryptManager==null) {

encryptManager=ApplicationUtils.getApplicationContext().getBean(EncryptManager.class);

}

return aesIntercept(invocation);

}else{

return invocation.proceed();

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值