【Java基础系列】body参数前后端不一致

news/2024/11/8 3:03:39/

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一.现象复原
      • 1.还原现场
      • 2.debug 截图
      • 3.Post 请求参数
    • 二.排查过程
      • 1.可能得情况
      • 2.字段解析错误
      • 3.@InitBinder 注解
      • 4.HttpServletRequestWrapper 拦截器

一.现象复原

1.还原现场

post 请求参数 detail 里有 15 条 断点看就只有 7 条了 丢了中间的 6-14 条数据 有什么好的排查方案吗

2.debug 截图

debug 截图只有 7 条

image-20231228133631525

3.Post 请求参数

post 请求的实际参数有 15 条

image-20231228133618980

二.排查过程

1.可能得情况

  1. @InitBinder 注解,
  2. 有没有 HttpServletRequestWrapper 拦截器以及相关的子类,
  3. Filter 以及相关的子类,
  4. WebMvcConfigurer 以及相关的子类,
  5. HandlerInterceptorAdapter 以及相关的子类

2.字段解析错误

排除这个错误,如果是字段解析错误的直接会报错,因为请求的参数多,和实体类不匹配会直接报错,所以这种情况可以直接排除掉。

3.@InitBinder 注解

@InitBinder 是 Spring MVC 提供的一个注解,它用于自定义数据绑定的一些规则或配置。通常,它用于注册一些自定义的编辑器(Editor)或验证器(Validator),以便在控制器中对请求参数进行预处理。

以下是 @InitBinder 注解的一些中文详解:

  1. 作用: @InitBinder 注解主要用于初始化 Web 数据绑定器,可以在控制器中对数据绑定进行自定义配置。

  2. 位置: 通常,@InitBinder 注解标注在一个控制器类的方法上,这个方法可以有任意的名称。在这个方法中,你可以注册一些自定义的编辑器或验证器。

  3. 方法签名: 注解的方法需要返回 void,而且需要接受一个 WebDataBinder 类型的参数。

    @InitBinder
    public void initBinder(WebDataBinder binder) {// 在这里进行数据绑定的初始化配置
    }
    
  4. WebDataBinder 参数: WebDataBinder 是 Spring MVC 中用于进行数据绑定的核心类,它包含了与数据绑定相关的各种方法和配置。

  5. 数据编辑器(Editor)的注册: 你可以使用 binder.registerCustomEditor 方法注册自定义的编辑器,用于将字符串转换为特定类型的数据。例如,将字符串转换为日期类型。

    @InitBinder
    public void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }
    
  6. 验证器(Validator)的注册: 通过 binder.addValidators 方法注册自定义的验证器,用于在数据绑定之前对数据进行验证。

    @InitBinder
    public void initBinder(WebDataBinder binder) {binder.addValidators(new MyCustomValidator());
    }
    
  7. 数据预处理:@InitBinder 方法中,你还可以进行一些其他的数据预处理操作,例如将字符串中的空格去除,或者将特定格式的数据进行处理。

    @InitBinder
    public void initBinder(WebDataBinder binder) {// 进行一些数据预处理的操作
    }
    

总体而言,@InitBinder 提供了一种灵活的机制,使得你可以在控制器中对数据绑定的行为进行个性化定制。这对于处理一些特殊的数据转换或验证需求非常有用。

4.HttpServletRequestWrapper 拦截器

HttpServletRequestWrapper 是一个用于包装 HttpServletRequest 的类,它允许你在处理请求时对原始的 HttpServletRequest 进行一些修改或增强。这通常在 Servlet 过滤器或拦截器中使用,用于对请求进行预处理或者修改请求参数等操作。

下面是一个简单的实例,演示了如何使用 HttpServletRequestWrapper 进行拦截器的请求修改:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;@WebFilter("/*")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化操作}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 将 ServletRequest 转换为 HttpServletRequestHttpServletRequest httpRequest = (HttpServletRequest) request;// 使用 HttpServletRequestWrapper 进行包装MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper(httpRequest);// 继续执行过滤器链chain.doFilter(requestWrapper, response);}@Overridepublic void destroy() {// 销毁操作}
}

然后,定义 MyHttpServletRequestWrapper 类,继承自 HttpServletRequestWrapper

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {public MyHttpServletRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {// 在这里可以对请求参数进行修改或增强String value = super.getParameter(name);// 示例:将参数值转为大写return (value != null) ? value.toUpperCase() : null;}// 如果需要对其他方法进行修改,可以覆盖相应的方法
}

在上述例子中,MyHttpServletRequestWrapper 重写了 getParameter 方法,在获取请求参数时将参数值转换为大写。你可以根据需要在 MyHttpServletRequestWrapper 中覆盖其他方法,以完成各种对请求的修改或增强操作。

注意:使用 HttpServletRequestWrapper 需要谨慎,确保你了解自己的需求和对请求的修改操作,以避免潜在的问题。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img


http://www.ppmy.cn/news/1287210.html

相关文章

Python编程者的元旦狂欢:一场别样的烟花盛宴

文章目录 一、前言二、实现步骤1.前期准备2.部分代码2.1 窗口设置2.2 烟花类 Firework2.3 粒子类 Particle2.4 轨迹类 Trail2.5 更新函数2.6 导入音频2.7 显示元旦快乐2.8 Esc键结束 3.完整代码(详细注释)4.视频效果5.可执行文件 三、总结 一、前言 202…

【Java进阶篇】什么是UUID,能不能保证唯一?

什么是UUID,能不能保证唯一? ✔️典型解析✔️优缺点 ✔️各个版本实现✔️V1.基于时间戳的UUID✔️V2.DCE(Distributed Computing Environment)安全的UUID✔️V3.基于名称空间的UUID(MD5)✔️V4.基于随机数的UUID✔️V5.基于名称空间的UUID(SHA1)✔️各个版本总结…

vue3框架笔记

Vue Vue 是一个渐进式的前端开发框架,很容易上手。Vue 目前的版本是 3.x,但是公司中也有很多使用的是 Vue2。Vue3 的 API 可以向下兼容 2,Vue3 中新增了很多新的写法。我们课程主要以 Vue3 为主 官网 我们学习 Vue 需要转变思想&#xff0…

Javaweb-servlet

一、servlet入门 1.Servlet介绍 (1)什么是Servlet Servlet是Server Applet的简称,是用Java编写的是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet&#…

自动化测试:selenium总结

前言 说到自动化测试,就不得不提大名鼎鼎的Selenium。Selenium 是如今最常用的自动化测试工具之一,支持快速开发自动化测试框架,且支持在多种浏览器上执行测试。 Selenium学习难度小,开发周期短。对测试人员来说,如果…

03 HAL库下UART的使用

引言: 需要使用到的uart调试工具在文章最后的资料里面 题外话:uart和usart的区别 UART(Universal Asynchronous Receiver/Transmitter)和USART(Universal Synchronous/Asynchronous Receiver/Transmitter)…

原生js浪费性能吗?

首先举一个例子: 我要更新10个DOM节点,浏览器会一个一个的进行更新,但它更新第一个的时候并不知道后面还有9个,所以会一个一个执行,共执行10次。每一次的更新都要去计算,但更新后DOM树变化了,更新第二个的时候,前一次计算的就没法…

《Python百宝箱》专栏目录

序号文章目录直达链接表白系列1无法拒绝的表白界面https://want595.blog.csdn.net/article/details/1352796112满屏飘字表白代码https://want595.blog.csdn.net/article/details/1352794873无限弹窗表白代码https://want595.blog.csdn.net/article/details/1352795754李峋同款可…