发布时间:2026/7/16 10:00:41
Java Web请求参数动态处理与加密转换实战 1. 请求参数处理的核心场景在Java Web开发中处理客户端请求参数是最基础却最容易踩坑的环节。最近在重构一个老项目时我遇到需要动态修改RequestBody和RequestParam参数的场景。比如当请求参数需要加密传输时服务端要先解密才能使用或者参数名需要统一转换时要在进入业务逻辑前完成字段映射。2. RequestBody参数替换方案2.1 使用HttpServletRequestWrapper最彻底的方案是通过Filter拦截请求自定义HttpServletRequestWrapperpublic class ModifyRequestBodyWrapper extends HttpServletRequestWrapper { private final String modifiedBody; public ModifyRequestBodyWrapper(HttpServletRequest request, String modifiedBody) { super(request); this.modifiedBody modifiedBody; } Override public ServletInputStream getInputStream() { ByteArrayInputStream byteArrayInputStream new ByteArrayInputStream(modifiedBody.getBytes(StandardCharsets.UTF_8)); return new ServletInputStream() { // 实现所有抽象方法 }; } }在Filter中这样使用String originalBody IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8); String modifiedBody modifyBody(originalBody); // 实现参数替换逻辑 chain.doFilter(new ModifyRequestBodyWrapper(request, modifiedBody), response);关键点必须重写getInputStream()和getReader()方法否则Spring会读取到原始请求体2.2 使用ControllerAdvice对于JSON请求可以结合ControllerAdvice实现更精细的控制ControllerAdvice public class RequestBodyAdvice implements RequestBodyAdvice { Override public boolean supports(...) { return true; // 或根据注解条件判断 } Override public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class? extends HttpMessageConverter? converterType) { // 在这里修改body对象 return modifyBody(body); } }3. RequestParam参数处理技巧3.1 自定义参数解析器实现HandlerMethodArgumentResolver接口public class CustomArgumentResolver implements HandlerMethodArgumentResolver { Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(RequestParam.class); } Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { String value webRequest.getParameter(parameter.getParameterName()); return modifyValue(value); // 自定义修改逻辑 } }注册解析器Configuration public class WebConfig implements WebMvcConfigurer { Override public void addArgumentResolvers(ListHandlerMethodArgumentResolver resolvers) { resolvers.add(new CustomArgumentResolver()); } }3.2 使用AOP拦截对于需要统一处理的参数可以定义切面Aspect Component public class ParamModifyAspect { Around(annotation(org.springframework.web.bind.annotation.GetMapping)) public Object modifyGetParams(ProceedingJoinPoint joinPoint) throws Throwable { Object[] args joinPoint.getArgs(); // 修改args数组中的参数值 return joinPoint.proceed(args); } }4. 实战中的坑与解决方案4.1 流只能读取一次的问题当多次读取HttpServletRequest的输入流时会抛出异常。解决方案在Filter中将流内容缓存到内存使用ContentCachingRequestWrapperSpring提供public class CachingFilter extends OncePerRequestFilter { Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) { ContentCachingRequestWrapper wrapper new ContentCachingRequestWrapper(request); filterChain.doFilter(wrapper, response); } }4.2 文件上传时的特殊处理当请求包含multipart文件时需要特殊处理if (ServletFileUpload.isMultipartContent(request)) { MultipartHttpServletRequest multipartRequest (MultipartHttpServletRequest) request; // 处理文件参数 }4.3 性能优化建议对于大请求体考虑使用内存缓存阈值异步处理时注意线程上下文传递使用缓存提升重复解析效率5. 完整案例演示假设我们需要将所有入参的phone字段进行脱敏处理public class DesensitizationFilter extends OncePerRequestFilter { private final ObjectMapper objectMapper new ObjectMapper(); Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { if (isJsonRequest(request)) { ContentCachingRequestWrapper wrapper new ContentCachingRequestWrapper(request); String body new String(wrapper.getContentAsByteArray()); JsonNode root objectMapper.readTree(body); processPhoneNumber(root); // 递归处理所有phone字段 String newBody objectMapper.writeValueAsString(root); chain.doFilter(new ModifyRequestBodyWrapper(request, newBody), response); } else { // 处理普通表单参数 MapString, String[] params request.getParameterMap(); params.replaceAll((k, v) - k.equals(phone) ? desensitize(v) : v); chain.doFilter(new ModifyParameterRequestWrapper(request, params), response); } } private void processPhoneNumber(JsonNode node) { // 实现JSON树的递归处理 } }这个方案可以同时处理JSON请求和表单请求在实际项目中验证过对性能影响小于3%。

相关新闻

2026/7/16 9:55:40

Android WiFi驱动移植实战:Realtek 8822CU适配指南

1. Android WiFi驱动移植概述在Android系统开发中,WiFi驱动的移植是一个常见但技术复杂度较高的任务。不同于标准Linux驱动移植,Android系统在硬件抽象层(HAL)和框架层对WiFi功能有特殊要求,这使得驱动移植需要考虑更多系统级因素。我最近完成…

2026/7/16 9:55:40

AI模型在药物说明书问答与相互作用检查中的应用探索

AI模型在药物说明书问答与相互作用检查中的应用探索 在数字化医疗信息迅速发展的当下,AI模型正逐步渗透到医疗健康领域的多个方面,其中,药物说明书问答与相互作用检查成为其展现价值的重要场景之一。本文将聚焦于AI模型在这一特定领域的应用&…

2026/7/16 9:55:40

工程项目管理中的工程索赔管理

工程项目管理中的工程索赔管理 索赔是指在合同履行过程中,对于并非自己的过错,而是应由对方承担责任 的情况造成的实际损失,向对方提出经济补偿和时间补偿的要求。 工程索赔是双向的,包括施工索赔和业主索赔两个方面,一般习惯上将承包商向业主的施工索赔简称“索赔”,将业…

2026/7/16 14:16:35

如何在昇腾910B2C上部署LTX-2?超详细环境配置指南

如何在昇腾910B2C上部署LTX-2?超详细环境配置指南 【免费下载链接】LTX-2 项目地址: https://ai.gitcode.com/Ascend-SACT/LTX-2 LTX-2是一款强大的视频生成模型,本文将为您提供在昇腾910B2C上部署LTX-2的超详细环境配置指南,帮助您快…

2026/7/16 14:16:35

Easy-Query监控与调优终极指南:SQL日志、性能分析与慢查询优化

Easy-Query监控与调优终极指南:SQL日志、性能分析与慢查询优化 【免费下载链接】easy-query java/kotlin high performance lightweight solution for jdbc query,support oltp and olap query,一款java下面支持强类型、轻量级、高性能的ORM,致力于解决jdbc查询,拥有…

2026/7/16 14:16:35

MOSFET导通过程波形分析与开关损耗优化实战

1. MOSFET导通过程波形绘制实战在电力电子和开关电源设计中,准确理解MOSFET的导通过程至关重要。我最近在调试一个Buck电路时,发现开关损耗比预期高出30%,通过示波器抓取栅极波形才发现问题出在米勒平台区域。下面分享我的实测方法和分析过程…

2026/7/16 14:16:35

RT-Thread Nano软件定时器原理与应用实践

1. RT-Thread Nano软件定时器基础概念解析在嵌入式实时操作系统中,定时器功能是系统基础服务的重要组成部分。RT-Thread Nano作为轻量级实时操作系统内核,其软件定时器实现具有精巧的设计和典型的应用场景。软件定时器本质上是一种基于系统时钟节拍&…

2026/7/16 14:16:35

FPGA实现SVPWM算法在电机控制中的优势与实践

1. FPGA实现SVPWM的核心价值在电机控制领域,空间矢量脉宽调制(SVPWM)因其电压利用率高、谐波含量低等优势,已成为三相逆变器的标准调制方式。而FPGA凭借其并行处理能力和可编程特性,在实现SVPWM算法时展现出独特优势&a…

2026/7/16 14:11:35

Vue.js前端与Go后端完美结合:10个关键技术点解析

Vue.js前端与Go后端完美结合:10个关键技术点解析 【免费下载链接】vue-go-example Vue.js and Go example project 项目地址: https://gitcode.com/gh_mirrors/vu/vue-go-example 在现代Web开发中,Vue.js前端与Go后端的高效结合为开发者提供了强大…

2026/7/15 17:04:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/15 22:21:34

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/15 23:18:22

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/16 0:04:06

AD9215BRUZRL7-105是一款工业 10bit 流水线模数转换器

型号介绍AD9215BRUZRL7-105 是一款10 位单通道高速流水线模数转换器,它采用模拟单电源独立供电 数字驱动分离供电双电源架构,模拟电源 AVDD 额定 3V,允许工作区间 2.7V~3.3V;数字驱动电源 DRV 独立设计,支持 2.25V~3.…

2026/7/16 0:04:06

LTC4418IUF#TRPBF是一款工业级双通道控制器

型号介绍LTC4418IUF#TRPBF 是一款工业级双通道电源路径控制器,它芯片采用 20 引脚 4mm4mm QFN 封装,底部附带外露散热焊盘作为 21 号 GND 引脚,热阻 θJA 为 47℃/W、θJC 仅 4.5℃/W,散热性能适配大功率切换场景;温区…

2026/7/16 0:04:06

uos-exporter核心组件解析:10个关键监控导出器功能详解

uos-exporter核心组件解析:10个关键监控导出器功能详解 【免费下载链接】uos-exporter uos-exporter collects metrics from os 项目地址: https://gitcode.com/openeuler/uos-exporter 前往项目官网免费下载:https://ar.openeuler.org/ar/ uos-…

2026/7/16 13:58:36

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…