对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

拦截

所有 HandlerMapping 实现都支持处理器拦截,当你希望在多个请求之间应用通用功能时,这非常有用。HandlerInterceptor 可以实现以下功能:spring-doc.cadn.net.cn

  • preHandle(..) — 在实际处理器执行之前调用的回调方法,返回一个布尔值。 如果该方法返回 true,则继续执行;如果返回 false,则跳过后续的执行链,且不会调用处理器。spring-doc.cadn.net.cn

  • postHandle(..) — 处理器执行后的回调。spring-doc.cadn.net.cn

  • afterCompletion(..) — 在完整请求完成后的回调。spring-doc.cadn.net.cn

对于使用 @ResponseBodyResponseEntity 的控制器方法,响应会在调用 HandlerAdapter 之前由 postHandle 写入并提交。这意味着此时再修改响应(例如添加额外的响应头)已经为时过晚。您可以实现 ResponseBodyAdvice 接口,并将其声明为一个 Controller Advice Bean,或者直接在 RequestMappingHandlerAdapter 上进行配置。

有关如何配置拦截器的示例,请参见 MVC 配置部分中的拦截器。您也可以通过在各个HandlerMapping实现上使用 setter 方法直接注册它们。spring-doc.cadn.net.cn

由于拦截器可能与带注解的控制器路径匹配不一致,因此不适合作为安全层。通常,我们建议使用 Spring Security,或者采用类似的方法集成到 Servlet 过滤器链中,并尽可能早地应用。