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对象。
修复方案
- 补全自定义Request包装类的方法覆盖:同时重写
getParameter()、getParameterValues()、getParameterMap()三个方法,所有返回值都经过XSS转义处理。 - 调整过滤器优先级:在web.xml或者FilterRegistrationBean中配置XSS过滤器为最高优先级,确保它在所有其他请求包装类过滤器之前执行。
- 兼容文件上传场景:如果项目存在上传请求,要么扩展
MultipartResolver在解析时做参数转义,要么在Request包装类中判断当前请求是否是MultipartRequest,主动从MultipartRequest中取参数做转义。 - 额外兼容JSON请求:如果项目中存在
@RequestBody接收JSON参数的接口,这类请求直接从输入流读取参数,不走getParameter系列方法,需要单独配置Jackson全局反序列化器做XSS转义。
内容的提问来源于stack exchange,提问作者Bhushan Karmarkar
相关产品推荐
相关产品推荐

