拦截
所有HandlerMapping
实现都支持处理程序拦截器,当您希望对某些请求应用特定功能时很有用,例如检查主体。拦截器必须实现org.springframework.web.servlet
包中的HandlerInterceptor
,具有三个方法,这些方法应提供足够的灵活性来进行各种预处理和后处理:
-
preHandle(..)
:在实际处理程序运行之前 -
postHandle(..)
:在处理程序运行之后 -
afterCompletion(..)
:在完整请求完成后
preHandle(..)
方法返回一个布尔值。您可以使用此方法来中断或继续执行链的处理。当此方法返回true
时,处理程序执行链继续。当它返回false时,DispatcherServlet
假定拦截器本身已处理了请求(例如,呈现了适当的视图),并且不继续执行其他拦截器和执行链中的实际处理程序。
请参阅MVC配置部分中的拦截器,了解如何配置拦截器的示例。您还可以通过在各个HandlerMapping
实现上使用setter直接注册它们。
postHandle
方法在使用@ResponseBody
和ResponseEntity
方法时不太有用,因为响应是在HandlerAdapter
中编写和提交的,而在postHandle
之前。这意味着现在对响应进行任何更改都太晚了,例如添加额外的标头。对于这种情况,您可以实现ResponseBodyAdvice
,并将其声明为Controller Advice bean,或直接在RequestMappingHandlerAdapter
上进行配置。