Interception

所有 HandlerMapping 实现都支持处理程序拦截,这在想要在多个请求中应用功能时非常有用。HandlerInterceptor 可以实现以下功能:

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

  • postHandle(..) —— 在处理程序运行后返回一个布尔值的回调。

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

对于 @ResponseBodyResponseEntity 控制器方法,响应是在调用 postHandle 之前在 HandlerAdapter 中写入并提交的。这意味着已经太晚而无法更改响应,例如添加附加标头。您可以实现 ResponseBodyAdvice 并将其声明为 Controller Advice bean,也可以在 RequestMappingHandlerAdapter 中直接对其进行配置。

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

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