拦截

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

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

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

  • afterCompletion(..) — 完成请求后的回调。

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

有关如何配置拦截器的示例,请参见 MVC 配置部分中的拦截器。您也可以通过使用各个HandlerMapping实现的setter来直接注册它们。

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