拦截

所有HandlerMapping实现都支持处理程序拦截器,当您希望对某些请求应用特定功能时很有用,例如检查主体。拦截器必须实现org.springframework.web.servlet包中的HandlerInterceptor,具有三个方法,这些方法应提供足够的灵活性来进行各种预处理和后处理:

  • preHandle(..):在实际处理程序运行之前

  • postHandle(..):在处理程序运行之后

  • afterCompletion(..):在完整请求完成后

preHandle(..)方法返回一个布尔值。您可以使用此方法来中断或继续执行链的处理。当此方法返回true时,处理程序执行链继续。当它返回false时,DispatcherServlet假定拦截器本身已处理了请求(例如,呈现了适当的视图),并且不继续执行其他拦截器和执行链中的实际处理程序。

请参阅MVC配置部分中的拦截器,了解如何配置拦截器的示例。您还可以通过在各个HandlerMapping实现上使用setter直接注册它们。

postHandle方法在使用@ResponseBodyResponseEntity方法时不太有用,因为响应是在HandlerAdapter中编写和提交的,而在postHandle之前。这意味着现在对响应进行任何更改都太晚了,例如添加额外的标头。对于这种情况,您可以实现ResponseBodyAdvice,并将其声明为Controller Advice bean,或直接在RequestMappingHandlerAdapter上进行配置。