@ControllerAdvice解密请求,加密响应
package com.xf.config; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Type; import java.util.List; import javax.annotation.Priority; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.http.HttpHeaders; 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.xf.common.NoSecret; import com.xf.service.CacheService; import com.xf.tools.AesUtils; import com.xf.tools.HttpServletRequestUtil; import com.xf.tools.JWTUtils; import cn.hutool.core.io.IoUtil; import lombok.val; @ControllerAdvice("com.xf.controller") @Priority(1) public class MyRequestBodyAdvice implements RequestBodyAdvice { @Autowired CacheService cacheService; @Override public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { return methodParameter.hasParameterAnnotation(RequestBody.class); } @Override public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException { val request = HttpServletRequestUtil.getRequest(); if (request.getServletPath().contains("login")) return inputMessage; if (!parameter.getMethod().isAnnotationPresent(NoSecret.class)) { return new HttpInputMessage() { @Override public InputStream getBody() throws IOException { List<String> tokenList = inputMessage.getHeaders().get("token"); if (tokenList.isEmpty()) { throw new RuntimeException("缺少必要参数"); } String token = tokenList.get(0); Integer accid = JWTUtils.getAccid(token); String bodyStr = IoUtil.read(inputMessage.getBody(), "utf-8"); val req = HttpServletRequestUtil.getRequest(); // Console.log(HttpServletRequestUtil.getAllRequestInfo()); // Console.log(bodyStr); val loginObj = cacheService.getLogin(accid); val key = loginObj.getString("key"); val iv = loginObj.getString("iv"); req.setAttribute("key", key); req.setAttribute("iv", iv); try { bodyStr = AesUtils.decrypt(bodyStr, key, iv); } catch (Exception e) { throw new RuntimeException("解密失败"); } return IoUtil.toStream(bodyStr, "utf-8"); } @Override public HttpHeaders getHeaders() { return inputMessage.getHeaders(); } }; } return null; } @Override public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { return body; } @Override public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { return body; } }
package com.xf.config; import java.util.HashMap; 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.JSONObject; import com.xf.common.R; import com.xf.tools.AesUtils; import com.xf.tools.HttpServletRequestUtil; import lombok.val; @ControllerAdvice("com.xf.controller") public class MyResponseBodyAdvice implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter returnType, Class converterType) { return true; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if (body instanceof R) { R tem = (R) body; // 前端非得强行有个data if (!tem.containsKey("data")) tem.put("data", new HashMap<String, Object>()); val req = HttpServletRequestUtil.getRequest(); if (req.getServletPath().contains("login")) return body; val key = req.getAttribute("key").toString(); val iv = req.getAttribute("iv").toString(); // return tem; try { return AesUtils.encrypt(JSONObject.toJSONString(tem), key, iv); } catch (Exception e) { return null; } } return body; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)