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

news2025/1/26 15:25:13

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

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化操作
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 将 ServletRequest 转换为 HttpServletRequest
        HttpServletRequest httpRequest = (HttpServletRequest) request;

        // 使用 HttpServletRequestWrapper 进行包装
        MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper(httpRequest);

        // 继续执行过滤器链
        chain.doFilter(requestWrapper, response);
    }

    @Override
    public 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);
    }

    @Override
    public 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.coloradmin.cn/o/1346910.html

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

相关文章

动态规划 | 鸡蛋问题 | 元旦假期来点“蛋”题

文章目录 鸡蛋掉落 - 两枚鸡蛋题目描述动态规划解法问题分析程序代码 鸡蛋掉落题目描述问题分析程序代码复杂度分析 鸡蛋掉落 - 两枚鸡蛋 题目描述 原题链接 给你 2 枚相同 的鸡蛋,和一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f ,满足 …

微信小程序开发系列-10组件间通信01

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》 《微信小程序开发系列-02注册小程序》 《微信小程序开发系列-03全局配置中的“window”和“tabBar”》 《微信小程序开发系列-04获取用户图像和昵称》 《微信小程序开发系列-05登录小程序》 《…

图文证明 泰勒公式展开

泰勒公式 泰勒公式简单来说就是,可以用一个N次多项式来表示出一个连续可导的函数 f(x) 是一个用函数在某点的信息描述其附近取值的公式 第一步 思考 这是一个sin(x)的图像 用函数在原点的信息描述其附近取值 用一阶导数贴合: 直接用切线来贴合就好 画一个点(0,sin(0)除的切…

内网常规攻击路径

点击星标,即时接收最新推文 随着网络技术的发展,企业内部网络架构的变化,网络设备多样性的增加,面对内网攻击,防御体系逐渐阶梯化,通过不同维度的防御联动,将攻击拒之门外。对于突破网络边界后进…

docker 私有仓库搭建,将镜像上传至私有仓库,从私有仓库拉取镜像

Docker 私有仓库 一、私有仓库搭建 # 1、拉取私有仓库镜像 docker pull registry # 2、启动私有仓库容器 docker run -id --nameregistry -p 5000:5000 registry # 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories&quo…

八个理由:从java8升级到Java17

目录 前言 1. 局部变量类型推断 2.switch表达式 3.文本块 4.Records 5.模式匹配instanceof 6. 密封类 7. HttpClient 8.性能和内存管理能力提高 前言 从Java 8 到 Java 20,Java 已经走过了漫长的道路,自 Java 8 以来,Java 生态系统…

DevExpress 皮肤改变触发后触发的事件,用来保存皮肤配置

代码: private UserLookAndFeel userLookAndFeel; public MainGeneral() {InitializeComponent();// 创建 UserLookAndFeel 实例userLookAndFeel new UserLookAndFeel(this);// 订阅 StyleChanged 事件userLookAndFeel.StyleChanged UserLookAndFeel_StyleChange…

学习体系结构 - AArch64内存管理

学习体系结构 - AArch64内存管理 Learn the architecture - AArch64 memory management Version 1.2 个人的英语很一般,对拿不准的翻译校准在后面添加了英文原文。 1、 概述 本指南介绍了AArch64中的内存转换,这是内存管理的关键。它解释了如何将虚拟地…

ACW741.斐波那契额数列

输入整数 N,求出斐波那契数列中的第 N项是多少。 斐波那契数列的第 0项是 0,第 1项是 1,从第 2 项开始的每一项都等于前两项之和。输入格式 第一行包含整数 T,表示共有T个测试数据。接下来 T行,每行包含一个整数 N。输…

Python高级用法:生成器(generator)

生成器(generator) 生成器是一种返回生成序列的方法,与直接使用列表等方式返回序列的方式不同的是,他的生成可以是无限的。 生成器可以与next搭配使用,可以被看作是一种特殊的迭代器。 yield语句 yield一般与循环相…

研究:同样的C++模板在多个cpp里出现,编译器是否要重复生成?

2023年就要过去,马上要跨如2024年。祝大家在新的一年,有个好收成。 一直以来不是很确定: 同样的的模板,在各个cpp分别出现,编译器要实现几份? 研究一下。 用命令行的编译方法,参考&#xff1a…

mxxWechatBot微信机器人V2使用教程(图文)最全最详细

大家伙,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 先看这里 mxxWechatBot功能列表一、前言二、适用人群三、准备工作四、获取账号五、下载资料 六、安装相关软件七、启动客户端八、注入并启动微信九、机器人的基本配置十、自定义接口开发 …

数据库系统概论SQL编程题合集(包含期末题、考研初试题以及复试题)

二、现有数据库casemanage中表结构如下图 1)请编写sql语句对年龄进行升序排列 select * from afinfo order by birth;2)请编写sql语句查询对“徐”姓开头的人员名单 select * from afinfo where name like 徐%;3)请编写sql语句修改“陈晓”…

【28】Kotlin语法进阶——使用协程编写高效的并发程序

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。 文章目录 一、Kotlin中的协程1.1 协程的基本用法1.1.1协程与协程作用域1.1.2 使用launch函数创建子协程1.1.3 通过suspend关键声明挂起函数1.1.4 coroutineScope函数 1.2…

对比学习简介

1. 引言 在本教程中,我们将介绍对比学习领域中的相关概念。首先,我们将讨论这种技术背后相关的理论知识;接着,我们将介绍最常见的对比学习的损失函数和常见的训练策略。 闲话少说,我们直接开始吧! 2. 举…

React is not defined解决

组件未引入React报错React is not defined 神奇的是代码内并没有用到React的地方 必需要导入React才不报错 看着就很奇怪 原因是因为React创建组件需要使用到React上的一个方法createClass创建组件 在babel-loader的babel/preset-react预设里写个配置即可不用导入也不报错: //…

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

第七章 为改变思考方式而改变 7.1 指针空值--nullptr 7.1.1 指针空值:从0到NULL,再到nullptr 传统C头文件里NULL是一个宏定义: 在函数重载同时出现int和char *参数版本的函数时,使用NULL作为参数调用函数会调用int参数版本&…

机器学习部分相关概念

数据集(Data Set)即数据的集合,每一条单独的数据被称为样本(Sample)。 对于每个样本,它通常具有一些属性(Attribute)或者特征(Feature), 特征所具体取得值被称为特征值(Feature Value)。 西瓜数据集 色泽根蒂纹理青绿稍蜷模糊乌黑蜷缩清晰 …

大数据 - 大数据入门第一篇 | 关于大数据你了解多少?

🐶1.1 概述 大数据(BigData):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据主要解决、海量数据的采…

【Linux】内核编译 镜像制作

文章目录 一、Ubuntu内核编译1.1 为什么自己编译内核1.2 Ubuntu 内核源码下载1.21 内核的作用1.22 Linux内核与ubuntu内核1.23 Ubuntu内核源码获取 1.3 在Windows系统下编译ubuntu内核1.4 在Linux系统下编译ubuntu内核 二、镜像制作 一、Ubuntu内核编译 1.1 为什么自己编译内核…