之前比较仓促,在每个接口都写了一段加解密代码,最近想尝试着用增强函数实现一下,不一定对之前功能完全匹配,只用来备忘。
RequestBodyAdvice可以理解为在@RequestBody之前需要进行的 操作,ResponseBodyAdvice可以理解为在@ResponseBody之后进行的操作,所以当接口需要加解密时,在使用@RequestBody接收前台参数之前可以先在RequestBodyAdvice的实现类中进行参数的解密,当操作结束需要返回数据时,可以在@ResponseBody之后进入ResponseBodyAdvice的实现类中进行参数的加密。
1.实现RequestBodyAdvice 接口:
/**
*
*/
package com.online.charge.publishes.bank.json;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Map;
import org.apache.logging.log4j.LogManager;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
import com.alibaba.fastjson.JSON;
import com.online.charge.publishes.bank.AESEncrypt.AESEncrypt;
/**
* @author lee
*
*/
@ControllerAdvice(basePackages = "com.online.charge.publishes.bank.json")
public class EncryptRequestBodyAdvice implements RequestBodyAdvice{
final static org.apache.logging.log4j.Logger logger = LogManager.getLogger(EncryptRequestBodyAdvice.class.getName());
@Override
public boolean supports(MethodParameter methodParameter, Type type,
Class<? extends HttpMessageConverter<?>> aClass) {
//判断是否有此注解,针对所有以@RequestBody的参数
boolean b = methodParameter.getParameterAnnotation(RequestBody.class) != null;
//只有为true时才会执行afterBodyRead
return b;
}
@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage httpInputMessage,
MethodParameter methodParameter, Type type,
Class<? extends HttpMessageConverter<?>> aClass) throws IOException {
return httpInputMessage;
}
@Override
public Object afterBodyRead(Object o, HttpInputMessage httpInputMessage,
MethodParameter methodParameter, Type type,
Class<? extends HttpMessageConverter<?>> aClass) {
String dealData = null;
try {
//以下是为了匹配我之前多个接口传过来的对象都不同,但是都有一个属性req用来存放加密串
//发射获取参数对象
Class clz =o.getClass();
//获取加密参数get方法
Method getReq = clz.getMethod("getReq");//得到方法对象
//执行get方法,得到加密串
Object req = getReq.invoke(o);
logger.info("请求参数密文为:{}", req.toString());
dealData = AESEncrypt.decrypt(req.toString());
} catch (Exception e) {
logger.error("异常!", e);
}
return dealData;
}
@Override
public Object handleEmptyBody(Object arg0, HttpInputMessage arg1,
MethodParameter arg2, Type arg3,
Class<? extends HttpMessageConverter<?>> arg4) {
// TODO Auto-generated method stub
return null;
}
}
2.实现ResponseBodyAdvice接口:
/**
*
*/
package com.online.charge.publishes.bank.json;
import org.apache.logging.log4j.LogManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.online.charge.publishes.bank.AESEncrypt.AESEncrypt;
import com.online.charge.publishes.bank.AESEncrypt.EncryptUtil;
/**
* @author lee
*
*/
@ControllerAdvice
public class EncryptResponseBodyAdvice implements ResponseBodyAdvice{
final static org.apache.logging.log4j.Logger logger = LogManager.getLogger(EncryptResponseBodyAdvice.class.getName());
@Override
public boolean supports(MethodParameter arg0, Class arg1) {
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter,
MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
String returnStr = "";
try {
//添加encry header,告诉前端数据已加密
serverHttpResponse.getHeaders().add("encry", "true");
String srcData = JSON.toJSONString(o);
//加密
returnStr = AESEncrypt.encrypt(JSONArray.toJSONString(srcData));
logger.info("原始数据={},加密后数据={}", srcData, returnStr);
} catch (Exception e) {
logger.error("异常!", e);
}
return returnStr;
}
}

被折叠的 条评论
为什么被折叠?



