【筆記】Spring MVC攔截入參、出參實現入參解密,出參加密統一管理
阿新 • • 發佈:2018-12-14
需求:為提高介面的安全性,對資料傳輸加密。
前提:Controller層使用@RequestBody接收入參,@ResponseBody出參
入參解密
package com.sep6th.base.core.advice;
import java.lang.reflect.Type;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter. HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter;
import com.sep6th.common.constant.BaseConstant;
import com. sep6th.common.util.AESUtil;
/**
* 對加密的請求引數,解密
*
* @date 2018/10/10 11:35
*/
@ControllerAdvice
public class RequestBodyDecryptAdvice extends RequestBodyAdviceAdapter {
/**
* 前置攔截匹配操作(定義自己業務相關的攔截匹配規則)
* 滿足為true的才會執行下面的方法
*
* @date 2018/10/10 11:43
*/
@Override
public boolean supports(MethodParameter methodParameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
return StringHttpMessageConverter.class.isAssignableFrom(converterType);
}
/**
* 對加密的請求引數,解密
*
* @date 2018/10/10 12:55
*/
@Override
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
//對加密的請求引數,解密
String jsonStrDecrypt = AESUtil.AES_Decrypt(BaseConstant.AES_KEY, String.valueOf(body));
System.out.println("對加密的請求引數,解密:"+ jsonStrDecrypt);
return jsonStrDecrypt;
}
}
出參加密
package com.sep6th.base.core.advice;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
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.sep6th.common.constant.BaseConstant;
import com.sep6th.common.util.AESUtil;
import com.sep6th.common.util.JsonUtils;
import com.sep6th.common.util.SysResult;
/**
* 對Controller層方法,返回型別是SysResult的返回資料加密
* 注意:定義自己業務相關的攔截匹配規則。
* 直接return true;是對所有返回資料加密。
*
* @date 2018/10/10 10:30
*/
@ControllerAdvice
public class ResponseBodyEncryptAdvice implements ResponseBodyAdvice<Object> {
/**
* 前置攔截匹配操作(定義自己業務相關的攔截匹配規則)
* true:就執行下面的beforeBodyWrite方法。
*
* @date 2018/10/10 11:27
*/
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> converterType) {
// 攔截Controller層返回型別是SysResult的方法
return methodParameter.getMethod().getReturnType().isAssignableFrom(SysResult.class);
}
/**
* 對返回值進行加密
*
* @date 2018/10/10 11:18
*/
@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
String jsonStr = JsonUtils.toFastJson(body);
System.out.println("獲取ResponseBody裡的內容:"+ jsonStr);
String jsonStrEncrypt = AESUtil.AES_Encrypt(BaseConstant.AES_KEY, jsonStr);
System.out.println("返回資料加密:"+ jsonStrEncrypt);
String jsonStrDecrypt = AESUtil.AES_Decrypt(BaseConstant.AES_KEY, jsonStrEncrypt);
System.out.println("對返回的加密資料解密:"+ jsonStrDecrypt);
return jsonStrEncrypt;
}
}