拦截

所有的 HandlerMapping 实现都支持处理器拦截,这在您希望跨请求应用功能时非常有用。HandlerInterceptor 可以实现以下功能:

  • preHandle(..) — 在实际处理器运行之前调用的回调,返回一个布尔值。如果方法返回 true,则执行继续;如果返回 false,则绕过其余的执行链,并且不调用处理器。

  • postHandle(..) — 在处理器运行之后调用的回调。

  • afterCompletion(..) — 在整个请求完成之后调用的回调。

对于 @ResponseBodyResponseEntity 控制器方法,响应是在 HandlerAdapter 内部写入并提交的,这发生在 postHandle 调用之前。这意味着此时更改响应(例如添加额外的头部)为时已晚。您可以实现 ResponseBodyAdvice 并将其声明为 控制器通知 bean,或者直接在 RequestMappingHandlerAdapter 上配置它。

有关如何配置拦截器的示例,请参阅 MVC 配置章节中的 拦截器。您也可以通过在各个 HandlerMapping 实现上使用设置器直接注册它们。

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