spring mvc 可通过自定义拦截器统一过滤请求参数,核心是在 prehandle 中包装 request 并清洗 query、form、json body 等内容,支持敏感字符转义或拒绝;需配合 contentcachingrequestwrapper 处理 json,配置排除路径,并分层设防确保安全。

Spring MVC 中可以通过自定义拦截器对请求参数进行统一过滤,拦截非法或敏感字符(如 SQL 注入、XSS 脚本、特殊控制字符等),核心思路是:在请求进入 Controller 前,遍历并清理 request 的参数值(包括 query string、form data、JSON body 等),对含敏感字符的字段做转义、替换或拒绝处理。
1. 编写敏感字符过滤拦截器
实现 HandlerInterceptor 接口,在 preHandle 方法中处理参数。注意:原始 request 是只读的,需包装为可修改的 HttpServletRequestWrapper。
- 继承
HttpServletRequestWrapper,重写getParameter、getParameterMap、getParameterValues等方法,返回已清洗后的值 - 定义敏感字符规则(如
<script></script>、' OR 1=1、javascript:、eval(、Unicode 控制字符等),建议用正则预编译提升性能 - 清洗策略可选:HTML 转义(
)、字符串替换(如 <code>"--" → "")、或直接抛出IllegalArgumentException拒绝请求
2. 支持 JSON 请求体的过滤
标准拦截器无法直接修改 JSON body(因为 body 只能读取一次),需配合 ContentCachingRequestWrapper 或自定义 Filter 提前缓存并解析。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 推荐在拦截器前加一个
OncePerRequestFilter,使用ContentCachingRequestWrapper包装 request - 读取原始 body 字符串,用 Jackson 或 Fastjson 解析为 Map/DTO,递归遍历所有 String 字段执行清洗
- 将清洗后的对象重新序列化为 byte[],通过反射设置到缓存 wrapper 中(或直接封装成新 request)
- 注意:若 Controller 使用
@RequestBody,需确保消息转换器(如MappingJackson2HttpMessageConverter)读取的是清洗后的内容
3. 配置拦截器生效范围与顺序
在 Spring MVC 配置类中注册拦截器,并明确排除静态资源、健康检查等无需过滤的路径。
- 使用
WebMvcConfigurer.addInterceptors()注册,指定excludePathPatterns(如"/static/**", "/actuator/**") - 若同时使用多个拦截器(如鉴权、日志、过滤),注意执行顺序:按注册顺序从前到后,
preHandle返回false会中断后续流程 - 敏感词库建议外置(如配置文件或数据库),支持热更新,避免硬编码
4. 补充建议:更安全的实践方式
拦截器适合做通用防护,但不能替代深层校验。应分层设防:
- 前端提交前做基础校验(如正则限制输入格式),减少无效请求
- Controller 层使用
@Valid+ 自定义注解(如@NoScript)做字段级校验 - Service 层对关键操作(如拼接 SQL、渲染 HTML)再次白名单校验,不依赖外部输入
- 日志记录清洗前的原始参数(脱敏后),便于审计和问题排查
不复杂但容易忽略:URL 路径变量(@PathVariable)和请求头(Header)同样可能含敏感内容,需在拦截器中一并检查;另外,过滤逻辑要兼容中文、emoji 等合法 Unicode 字符,避免误杀。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










