过滤器在rest接口中用于前置拦截敏感请求,通过路径、方法、请求头及请求体等维度识别风险,统一拒绝或脱敏;其位于servlet最外层,适合硬拦截,而细粒度控制应交由interceptor。

在 REST 接口开发中,用过滤器拦截并过滤敏感请求,核心是**在请求进入业务逻辑前识别风险特征,并主动拒绝或脱敏处理**,而不是等 Controller 层再判断。过滤器(Filter)位于 Servlet 容器最外层,天然适合做统一、前置的安全控制。
识别哪些请求算“敏感”
敏感请求没有固定标准,需结合业务定义。常见判定维度包括:
-
路径匹配:如
/admin/、/api/v1/users/me/password、/actuator/等高危路径 -
HTTP 方法 + 路径组合:如
DELETE /api/v1/users/{id}或PUT /api/v1/config -
请求头特征:缺失必要认证头(
Authorization、X-Api-Key)、含可疑 User-Agent(如扫描器指纹)、X-Forwarded-For为黑名单 IP -
请求体内容:Body 中包含 SQL 关键字(
union select)、脚本标签(<script></script>)、或触发自定义规则的敏感字段值(如"role":"admin"出现在普通用户接口)
用 Filter 实现拦截逻辑(Spring Boot 示例)
继承 OncePerRequestFilter,确保异步/转发场景下只执行一次:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在
doFilterInternal中先调用request.getServletPath()和request.getMethod()获取基础信息 - 对需要读 Body 的场景(如校验 JSON 内容),必须用
ContentCachingRequestWrapper包装 request,避免流被消费两次 - 若判定为敏感请求,直接调用
response.sendError(403, "Forbidden")或写入自定义错误响应体,然后return,不执行chain.doFilter() - 若只需脱敏(如隐藏手机号),可修改 wrapper 中缓存的 body 字节数组,再继续放行
注意与拦截器(Interceptor)的分工
Filter 做的是“能不能进”的硬拦截;而 Interceptor 更适合做“进来后怎么处理”的增强:
- Filter 无法获取 Spring MVC 的
HandlerMethod,所以不能基于某个@PostMapping("/user")注解动态决策 - 如果敏感逻辑强依赖 Controller 方法签名(比如只对加了
@Sensitive注解的方法拦截),应改用HandlerInterceptor.preHandle,通过handler参数拿到目标方法再判断 - 二者可共存:Filter 拦全局高危路径,Interceptor 补充细粒度注解控制
配套建议:别只靠代码硬拦
真正有效的敏感请求防护是分层的:
-
网关层前置:Nginx 或 Spring Cloud Gateway 配置 IP 白名单、路径限流、WAF 规则(如拦截
select.*from),减轻应用层压力 -
日志脱敏同步做:在同个 Filter 里记录请求日志时,自动替换
Authorization: Bearer xxx为Authorization: [REDACTED],避免密钥泄露 -
拒绝响应要一致:返回 403 时,响应体格式、Header(如
X-Content-Type-Options: nosniff)应与正常接口对齐,防止攻击者通过响应差异探测系统细节










