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

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
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.mzph.cn/news/582150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次

前言:定时器TIM的详细知识点见我的博文:11.TIM定时中断-CSDN博客 STM32定时器时间计算公式 公式解释: ARR(TIM_Period):自动重装载值,是定时器溢出前的计数值 PSC(TIM_Prescaler&…

Docker自建文件快递柜系统

Docker自建文件快递柜系统。 软件特色: 轻量简洁:FastapiSqlite3Vue2ElementUI 轻松上传:复制粘贴,拖拽选择 多种类型:文本,文件 防止爆破:错误次数限制 防止滥用:IP限制上传次数…

掌握激活函数(一):深度学习的成功之源

文章目录 引言基本概念常用激活函数举例Sigmoid激活函数公式Sigmoid函数的数学特性示例基于NumPy和PyTorch实现Sigmoid函数将Sigmoid函数应用于二分类任务 Sigmoid激活函数的局限性举例 ReLU激活函数公式ReLU函数的数学特性ReLU函数的特点示例基于NumPy和PyTorch实现ReLU函数搭…

软件测试/测试开发丨学习笔记之Python控制流-分支、循环

分支判断 什么是分支判断 一条一条语句顺序执行叫做顺序结构分支结构就是在某个判断条件后,选择一条分支去执行 1. IF if condition_1:statement_block_1 elif condition_2:statement_block_2 else:statement_block_32. if 嵌套 在嵌套 if 语句中,可…

文件过大放不了U盘?三个方法非常简单~

文件过大放不了U盘我们可以从文件过大这个角度来解决一下这个问题,可以借助一些工具把文件压缩后,体积变小后,再放入U盘,使得u盘得到高效的利用,下面是推荐的一些好用的软件。 一、嗨格式压缩大师 是一款可以压缩多种…

数据结构学习 Leetcode474 一和零

关键词:动态规划 01背包 一个套路: 01背包:空间优化之后dp【target1】,遍历的时候要逆序遍历完全背包:空间优化之后dp【target1】,遍历的时候要正序遍历 目录 题目: 思路: 复杂…

BloombergGPT—金融领域大模型

文章目录 背景BloombergGPT数据集金融领域数据集通用数据集分词 模型模型结构模型相关参数训练配置训练过程 模型评估评估任务分布模型对比金融领域评估通用领域评估 背景 GPT-3的发布证明了训练非常大的自回归语言模型(LLM)的强大优势。GPT-3有1750亿个…

《深入理解C++11:C++11新特性解析与应用》笔记四

第四章 新手易学,老兵易用 4.1 右尖括号>的改进 在 C98 中,有一条需要程序员规避的规则:如果在实例化模板的时候出现了连续的两个右尖括号 >,那么它们之间需要一个空格来进行分隔,以避免发生编译时的错误。C98 会将>&g…

ubuntu22下安装minconda

bing 搜索 canda install 找到官方网站 https://docs.conda.io/projects/miniconda/en/latest/ 这里我们安装minconda。 官网有安装方法。 mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh…

【K8S 二进制部署】部署单Master Kurbernetes集群

目录 一、基本架构和系统初始化 1、集群架构: 2、操作系统初始化配置: 2.1、关闭防火墙和安全机制: 2.2、关闭swap 2.3、根据规划设置主机名 2.4、三台主机全部互相映射 2.5、调整内核参数 3、时间同步(所有节点时间必须同…

考研结束,以下事情要抓紧做了!

Hello,大家好,我是 Sunday。 首先恭喜大家考研结束,也在这里祝各位考研的同学们可以 成功上岸 ✿✿ヽ(▽)ノ✿。 不过,考试结束并不是一个终点,而是另外一个新的起点。摆在大家面前的,还有很多新的问题&a…

百度CTO王海峰:飞桨开发者已达1070万

目录 写在前面 飞桨开发者已达1070万 文心一言用户规模破亿,日提问量快速增长 写在前面 “文心一言用户规模突破1亿。”12月28日,百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰在第十届WAVE SUMMIT深度学习开发者大会上宣布。会上&…

【AIGC_MIDJOURNEY】专业提示词+配图分析

prompt : landscape of beautiful forest, lush foliage and water falls, crystal clear lake, fire flies, twinkling lights , rococo, art nouveau, --ar 16:9 这个提示词描述了一个美丽的森林景观,包括茂密的植被和瀑布,清澈见底的湖泊,…

干货!一文详解车间管理的五大基本方法

车间管理是制造型企业生产过程中的重要环节,它直接影响着企业的生产效率、成本控制、产品质量以及员工的士气与工作效率。优秀的车间管理不仅能够提升产品的质量和生产力,还能降低运营成本,从而在激烈的市场竞争中为企业赢得优势。 为了帮助…

vue3-13

token可以是后端api的访问依据,一般绝大多数时候,前端要访问后端的api,后端都要求前端请求需要携带一个有效的token,这个token用于用户的身份校验,通过了校验,后端才会向前端返回数据,进行相应的操作,如果没…

Linux的LVM与磁盘配额

一.LVM 1.什么是LVM Logical Volume Manager 逻辑卷管理 能够在保持现有数据不变的情况下,动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件,不能基于LVM创建 解释:就是将多个不同的物理卷组合在一起形…

Python高级用法:迭代器(iter)

迭代器 迭代器是一个实现了迭代器协议的容器对象。它基于以下两个方法。 __ next __:返回容器的下一个元素。 __ iter __:返回迭代器本身 迭代器可以利用内置的iter函数和一个序列来创建, 假设我们的序列为[1, 2, 3],迭代器创建过程如下: i…

读取无标题列表txt文本文件

文件如下: 使用pandas直接读取,有多少条数据,就会读出来多少列: import pandas as pdfilepath/Users/。。。/ file1失败名单.txt df1pd.read_csv(filepathfile1,sep,,headerNone) 会打印出无数列数据: 使用open方法读…

31.Java程序设计-基于Springboot的鲜花商城系统的设计与实现

引言 背景介绍:鲜花商城系统的兴起和发展。研究目的:设计并实现一个基于Spring Boot的鲜花商城系统。论文结构概述。 文献综述 回顾相关鲜花商城系统的设计与实现。分析不同系统的优缺点。强调Spring Boot在系统设计中的优越性。 系统设计 需求分析 用户…

优秀数据库开发工具Navicat Premium 16 Mac/win中文版

Navicat Premium 16作为一款综合性的数据库开发工具,可以支持主流的数据库管理系统,如MySQL、MariaDB、Oracle、SQL Server等。无论是进行数据库建模、数据导入导出、SQL脚本编辑,还是数据同步、备份恢复等操作,Navicat Premium 1…