public class EncryptInterceptor implements MethodInterceptor {
private final IDataCryptor encryptUtil;
public EncryptInterceptor(IDataCryptor encryptUtil) {
this.encryptUtil = encryptUtil;
}
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Method method = invocation.getMethod();
//方法是否有加解密注解,如果有的话,返回值为String、List等类型时需要解密返回。
EncryptField encryptField = method.getAnnotation(EncryptField.class);
boolean hasEncryptField = false;
if (encryptField != null){
hasEncryptField = true;
}
encrypt(invocation);
Object returnParam = invocation.proceed();
return decrypt(returnParam, hasEncryptField);
}
/**
* 加密
*/
public void encrypt(MethodInvocation invocation){
Object[] params = invocation.getArguments();
Method method = invocation.getMethod();
Annotation[][] annotations = method.getParameterAnnotations();
if (params.length != 0) {
for (int i = 0; i < params.length; i++) {
Object o = params[i];
if (o != null) {
boolean hasEncryptField =false;
Annotation[] paramAnn = annotations[i];
for (Annotation annotation : paramAnn) {
//判断当前参数是否有注解为EncryptField
if (annotation.annotationType().equals(EncryptField.class)) {
hasEncryptField = true;
break;
}
}
if (o instanceof String) {
//没有加密注解,跳过
if (!hasEncryptField) {
continue;
}
params[i] = handlerString(o, true);
} else {
params[i] = handler(o, true, hasEncryptField);
}
}
}
}
}
/**
* 解密
* @param hasEncryptField 返回参数是String、List等类型时,是否解密。
*/
public Object decrypt(Object obj, boolean hasEncryptField){
if (obj != null) {
if (obj instanceof String && hasEncryptField) {
return handlerString(obj, false);
} else {
return handler(obj, false, hasEncryptField);
}
}
return obj;
}
/**
* 处理String类型的请求、响应参数
* @param obj
* @param isEncrypt
* @return
*/
private Object handlerString (Object obj, boolean isEncrypt){
if (Objects.isNull(obj)) {
return obj;
}
String realValue = String.valueOf(obj);
if (isEncrypt && !encryptUtil.isEncrypted(realValue)) {
obj = encryptUtil.encrypt(realValue);
} else if (!isEncrypt && encryptUtil.isEncrypted(realValue)) {
obj = encryptUtil.decrypt(realValue);
}
return obj;
}
/**
* 加密Object 类型的参数
* @param obj
* @param isEncrypt
* @param hasEncryptField 请求、返回参数是List等类型时否需要加解密。
* @return
*/
private Object handler(Object obj, boolean isEncrypt, boolean hasEncryptField){
if (Objects.isNull(obj)) {
return null;
}
if (obj instanceof Collection) {
Collection |