REST接口全局拦截核心是分层选型+统一收口:Filter处理原始请求响应(如跨域、IP过滤),Interceptor获取HandlerMethod做权限校验与耗时统计,WebFilter用于WebFlux;统一用Result<T>封装响应,@RestControllerAdvice集中异常处理,Interceptor协同实现前置校验与日志记录。

在 REST 接口开发中,配置全局统一的请求响应拦截器,核心是分层选型 + 统一收口:根据关注点不同,选用 Filter、Interceptor 或 WebFilter,再通过统一结构封装响应体、集中处理异常,最终让所有接口输出格式一致、日志可追溯、安全策略生效。
按职责选对拦截层级
不同组件能拿到的信息不同,不能混用:
- Servlet Filter:最外层,能拿到原始 request/response,适合日志记录、IP 过滤、跨域设置、请求体解密等;但拿不到 Controller 方法名、参数值
- Spring MVC Interceptor:在 DispatcherServlet 内,可获取 HandlerMethod(即哪个 Controller 哪个方法),适合权限校验、接口耗时统计、白名单控制;但无法读取请求体流(已消耗)
- WebFlux WebFilter:对应响应式栈,替代 Interceptor;若项目用 Spring WebFlux,必须用它而非 Interceptor
统一响应格式靠 @ControllerAdvice + 拦截器协同
仅靠拦截器无法改变 Controller 返回值结构;需组合使用:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 定义标准响应类
Result<T>,含 code、message、data 字段,搭配枚举管理状态码(如 SUCCESS=200、FORBIDDEN=403) - 用
@RestControllerAdvice全局捕获异常,将业务异常、参数异常、系统异常统一转为Result.error(...) - 在 Interceptor 的
preHandle中做前置校验(如 token 解析、IP 白名单),失败直接写响应并 return false;成功才放行到 Controller - 在 Interceptor 的
afterCompletion中记录耗时、状态码,补全日志上下文
请求/响应内容自动记录(调试与审计必备)
尤其对接第三方或排查问题时,需完整留痕:
- Filter 层可包装
HttpServletRequestWrapper和HttpServletResponseWrapper,缓存请求体和响应体(注意流只能读一次) - RestTemplate 场景下,实现
ClientHttpRequestInterceptor,在intercept()中打印 URI、method、headers、body、status、response body - Feign 用户可用
feign.Logger级别控制,或自定义RequestInterceptor注入 traceId、签名头等
避免常见陷阱
看似简单,实操容易翻车:
- 不要在 Filter 或 Interceptor 中直接调用
response.getWriter().write(...)后又放行——会导致响应已提交异常 - 排除 Swagger、Actuator、静态资源路径,否则文档打不开、健康检查失败;Interceptor 注册时明确
registry.excludePathPatterns("/actuator/**", "/swagger-ui/**") - 若用了 Nginx,
request.getRemoteAddr()是 Nginx IP,需从X-Forwarded-For取真实 IP,但要校验头是否可信(防伪造) - 响应体加密/压缩逻辑,应放在 Filter 最外层,确保所有响应(包括异常响应)都被处理

















