You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中@ModelAttribute是否会内部调用request.getParameter()方法?

Spring @ModelAttribute参数绑定与XSS过滤器不生效问题解答

核心问题答复

Spring MVC对@ModelAttribute注解标注的模型做参数绑定时,针对普通GET请求的查询参数、application/x-www-form-urlencoded类型的POST表单请求,默认会调用ServletRequest的getParameter相关方法,你的XSS过滤逻辑未生效是方法覆盖不完整、过滤器顺序不对两类常见问题导致。

具体原因分析

  • Spring绑定模型属性时,不会只调用getParameter()单个方法:实际流程是优先调用getParameterMap()获取全量参数键值集合,再匹配模型属性名赋值,单值属性会取getParameterValues()返回数组的第一个元素。仅重写getParameter()方法的话,Spring的绑定逻辑根本不会走到你自定义的转义代码。
  • 如果你的请求是multipart/form-data类型的上传请求,Spring会先通过MultipartResolver解析请求生成MultipartRequest,参数直接从解析后的对象中获取,没有走你包装的原始Request,也会导致过滤逻辑失效。
  • 如果你自定义的XSS过滤器优先级低于Spring的内置过滤器(比如HiddenHttpMethodFilter、RequestContextFilter),这些过滤器会提前把原始Request包装替换,后续Spring MVC拿到的就不是你做了XSS转义的Request对象。

修复方案

  1. 补全自定义Request包装类的方法覆盖:同时重写getParameter()、getParameterValues()、getParameterMap()三个方法,所有返回值都经过XSS转义处理。
  2. 调整过滤器优先级:在web.xml或者FilterRegistrationBean中配置XSS过滤器为最高优先级,确保它在所有其他请求包装类过滤器之前执行。
  3. 兼容文件上传场景:如果项目存在上传请求,要么扩展MultipartResolver在解析时做参数转义,要么在Request包装类中判断当前请求是否是MultipartRequest,主动从MultipartRequest中取参数做转义。
  4. 额外兼容JSON请求:如果项目中存在@RequestBody接收JSON参数的接口,这类请求直接从输入流读取参数,不走getParameter系列方法,需要单独配置Jackson全局反序列化器做XSS转义。

内容的提问来源于stack exchange,提问作者Bhushan Karmarkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:45:08