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 java.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.interceptor;
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<?> 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) {
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 {
field.set(o, null);
}
} catch (illegalaccessexception e) {
// 处理异常
log.error(e.getmessage(), e);
}
}
}
}
}
return invocation.proceed();
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论