【笔记】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; 
	}
}
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值