配置拦截器(HandlerInterceptor)
2019-07-08 本文已影响0人
xzz4632
1. HandlerInterceptor
定义拦截器必须实现HandlerInterceptor
接口. 这对所有的HandlerMapping
都有效. 它定义了三个方法:
-
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
:
在实际处理程序执行之前执行. 返回true, 请求继续往下执行, 如果返回false, DispatcherServlet会假定请求已被拦截器处理完成了(不再继续执行其他逻辑). -
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
:
在处理程序执行之后执行. -
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex)
:
请求完成之后执行.
注意:postHandler
方法在@ResponseBody和ResponseEntity方法中是无效的, 因为这些方法在它之前就提交了响应. 对于这种情况, 可以实现ResponseBodyAdvice接口,然后将其声明为一个Controller Advice bean, 或直接在RequestMappingHandlerAdapter中配置它.
2. 配置拦截器
- java配置:
实现WebMvcConfigurer
接口, 并在registry.addInterceptor
方法中注册自定义的拦截器, 并通过addPathPatterns()
方法添加拦截的url.
@Configuration
@EnableWebMvc
public class MyWebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
- xml配置:
<mvc:interceptors>
<mvc:interceptor>
<!--拦截路径-->
<mvc:mapping path="/**"/>
<!--拦截器类-->
<bean class="com.xzz.config.MyHandlerInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>