拦截
所有 HandlerMapping
实现都支持处理器拦截,这在您希望跨请求应用功能时非常有用。HandlerInterceptor
可以实现以下接口/方法:
-
preHandle(..)
— 实际处理器运行前的回调,返回布尔值。如果方法返回true
,则继续执行;如果返回false
,则跳过执行链的其余部分,并且不调用处理器。 -
postHandle(..)
— 处理器运行后的回调。 -
afterCompletion(..)
— 完整请求处理后的回调。
对于 @ResponseBody 和 ResponseEntity 控制器方法,响应会在调用 postHandle 之前在 HandlerAdapter 中写入并提交。这意味着更改响应(例如添加额外的头部)已经太晚了。您可以实现 ResponseBodyAdvice 并将其声明为一个 Controller Advice bean,或者直接在 RequestMappingHandlerAdapter 上配置它。 |
请参阅 MVC 配置章节中的拦截器,了解如何配置拦截器的示例。您也可以直接在各个 HandlerMapping
实现上使用 setter 方法注册它们。
拦截器并非理想的安全层,因为可能与注解式控制器的路径匹配不一致。通常,我们建议使用 Spring Security,或者采用类似的方法与 Servlet 过滤器链集成,并尽可能早地应用。 |