java注解拦截器,数据库自动解密

数据库中加密数据

你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新建注解类:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptField {
String value() default “”;
}

根据执行的sql包含update和query拦截到有注解的字段,通过反射机制获取指定参数的值:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptField {
    String value() default "";
}

```java
// 解密密拦截
@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})
})
public class ParameterInterceptor implements Interceptor {

    protected final Logger log = Logger.getLogger(getClass());

    public static final String  KEY = "BDA52970EFA896C18A5D37C0";

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        MappedStatement statement = (MappedStatement) invocation.getArgs()[0];
        String methodName = invocation.getMethod().getName();
        Object parameter = invocation.getArgs()[1];
        BoundSql sql = statement.getBoundSql(parameter);
        log.error(sql.getSql());
        Object returnValue = invocation.proceed();
        if(returnValue instanceof ArrayList<?>){
            List<?> list = (ArrayList<?>)returnValue;
            for(Object val:list){
                //通过反射获取修改参数
                Field[] fields = val.getClass().getDeclaredFields();
                for (int i = 0; i < fields.length; i++) {
                    fields[i].setAccessible(true);
                    if(fields[i].isAnnotationPresent(EncryptField.class) && fields[i].getType().toString().endsWith("String"))
                    {
                        String   data = "";
                        String par = (String) getFieldValueByName(fields[i].getName(),val);
                        try {
                            //AppDESUtil解密的方法,根据你自己需求定义
                            data = AppDESUtil.decrypt(par, KEY);
                            if (null == data || "".equals(data)){
                                data = par;
                            }
                        } catch (Exception e){
                            // 如果之前没有加密数据直接用直接前的
                            data = par;
                        }
                        fields[i].set(val,data);
                    }
                }

            }
        }
        return returnValue;
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        // TODO Auto-generated method stub

    }

    /* 根据属性名获取属性值
     * */
    private static Object getFieldValueByName(String fieldName, Object o) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = o.getClass().getMethod(getter, new Class[] {});
            Object value = method.invoke(o, new Object[] {});
            return value;
        } catch (Exception e) {

            return null;
        }
    }


}

数据库的user实体类代码如下:

在这里插入图片描述

总结:数据库加上对应注解,update和query的语句进入实体找到注解的拦截器过滤解密在返回,如此写完解密的加上注解即可

发布了3 篇原创文章 · 获赞 0 · 访问量 58
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览