mybatis拦截器自动加密解密教程
目录
- myBATis拦截器自动加密解密
- 来看实例
- 总结
mybatis拦截器自动加密解密
来看实例
import kai8.system.annotation.EncryptDecryptField; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.executor.parameter.ParameterHandler; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Signature; import org.springframework.stereotype.Component; import Javaphp.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.PreparedStatement; import java.util.Objects; @Slf4j @Component @Intercepts({ @Signature(type = ParameterHandler.class, method = "setParameters", args = PreparedStatement.class) }) public class EncryptionInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { ParameterHandler item = (ParameterHandler) invocation.getTarget(); Field parameterObject = item.getClass().getDeclaredField("parameterObject"); parameterObject.setAccessible(true); Object o = parameterObject.get(item); if (!Objects.isNull(o)) { Class<?> aClass = o.getClass(); for (; aClass != Object.class; aClass = aClass.getSuperclass()) {//向上循环 遍历父类 Field[] declaredFields = aClass.getDeclaredFields(); for (Field field : declaredFields) { // 如果属性带有EncryptField注解放到要加解密的集合中 if (field.isAnnotationPresent(EncryptDecryptField.class)) { field.setAccessible(true); try { // 假设你有某种方法获取加密值(根据你的逻辑) String encryptedValue = (String) field.get(o); if (encryptedValue != null && !"".equals(encryptedValue)) { EncryptDecryptField annotation = field.getAnnotation(EncryptDecryptField.class); Class<?> value = annotation.value(); Method method = value.getMethod(annotation.encrypt(), String.class); Object invoke = method.invoke(value, encryptedValue); field.set(o, invoke); } else { field.set(o, null); } } catch (IllegalAccessException e) { // 处理异常 log.error(e.getMessage(), e); } } } } } return invocation.proceed(); } }
import kai8.system.annotation.EncryptDecryptField; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.executor.parameter.ParameterHandler; import org.apache.ibatis.executor.resultset.ResultSetHandler; import org.apache.ibatis.plugin.Intercepthttp://www.devze.comor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Signature; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.Statement; import java.util.Objects; @Slf4j @Intercepts({@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})}) public class DecryptInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { ParameterHandler item = (ParameterHandler) invocation.getTarget(); Field parameterObject = item.getClass().getDeclaredField("parameterObject"); parameterObject.setAccessible(true); Object o = parameterObject.get(item); if (!Objects.isNull(o)) { Class<?&编程客栈gt; aClass = o.getClass(); for (; aClass != Object.class; aClass = aClass.getSuperclass()) {//向上循环 遍历父类 Field[] declaredFields = aClass.getDeclaredFields(); for (Field field : declaredFields) { // 如果属性带有EncryptField注解放到要加解密的集合中 if (field.isAnnotationPresent(EncryptDecryptField.class)) { field.setAccessible(true); try { // 假设你有某种方法获取加密值(根据javascript你的逻辑) String encryptedValue = (String) field.get(o); if (encryptedValue != null) { EncryptDecryptField annotation = field.getAnnotation(EncryptDecryptField.class); Class<?> value = annotation.value(); Method method = value.getMethod(annotation.decrypt(), String.class); Object invoke = method.invoke(value, encryptedValue); // String decryptedValue = ArithmeticAPI.base64Decod(encryptedValue); field.set(o, invoke); } else { http://www.devze.com field.set(o, null); } } catch (IllegalAccessException e) { // 处理异常 log.error(e.getMessage(), e); } } } } } return invocation.proceed(); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论