1. 程式人生 > >【筆記】Spring MVC攔截入參、出參實現入參解密,出參加密統一管理

【筆記】Spring MVC攔截入參、出參實現入參解密,出參加密統一管理

需求:為提高介面的安全性,對資料傳輸加密。
前提: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; 
	}
}