1、主要实现类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
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.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.lang.reflect.Type;
@RestControllerAdvice
public class EncryptBody implements ResponseBodyAdvice , RequestBodyAdvice {
@Autowired
private HttpServletRequest request;
@Override
public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) throws IOException {
return httpInputMessage;
}
/**
* 响应数据加密
* @param o
* @param methodParameter
* @param mediaType
* @param aClass
* @param serverHttpRequest
* @param serverHttpResponse
* @return
*/
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//检查是否需要加密
if(CommonConstant.isEncrypt && !methodParameter.getMethod().isAnnotationPresent(ExcludeEncrypt.class)){
//需要加密
return encrypt(o);
}
return o;
}
/**
* 请求体数据解密
* @param o
* @param httpInputMessage
* @param methodParameter
* @param type
* @param aClass
* @return
*/
@Override
public Object afterBodyRead(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
if(CommonConstant.isEncrypt && !methodParameter.getMethod().isAnnotationPresent(ExcludeEncrypt.class)){
//数据解密
return decrypt(o)
}
return o;
}
@Override
public Object handleEmptyBody(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
return null;
}
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
return true;
}
}
2、常量注解类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 排除在加密之外
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcludeEncrypt {
}
/**
* 系统常量
*/
public class CommonConstant {
/**
* 是否开启加密 true开启 false关闭
*/
public final static boolean isEncrypt = false;
}
该博客介绍了一个Spring Boot应用中实现的数据加密和解密拦截器。`EncryptBody`类作为全局的`ResponseBodyAdvice`和`RequestBodyAdvice`,在请求和响应时检查是否需要进行加密操作。如果`@ExcludeEncrypt`注解存在,则跳过加密。系统常量`CommonConstant`用于控制加密开关。此功能增强了应用程序的安全性,确保敏感数据在传输过程中的安全性。
582

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



