SpringMVC多拦截器配置
单个拦截器
1.创建拦截器
实现接口HandlerInterceptor,重写拦截器方法
preHandle:在Controller方法执行前执行
postHandle:在Controller方法执行后,DispatcherServlet进行视图的渲染之前执行
afterCompletion:在DispatcherServlet进行视图的渲染之后
@Slf4j
public class InterceptorOne implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURL().toString();
log.info("1 InterceptorOne url == " + url);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("1 InterceptorOne->postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("1 InterceptorOne->afterCompletion");
}
}
2.将拦截器注册
实现WebMvcConfigurer接口,重写addInterceptors方法
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new InterceptorOne());
}
3.Controller测试
@RestController
public class InterceptController {
@RequestMapping("/test")
public String reqUrl (){
return "success" ;
}
}
4.执行结果
preHandle方法返回true,即成功
preHandle方法返回false,即失败
由运行结果可知,当请求被拦截时,postHandle与afterCompletion方法都不会被执行
多个拦截器
1.创建拦截器
同单个拦截器,然后额外添加两个拦截器
@Slf4j
public class InterceptorTwo implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURL().toString();
log.info("2 InterceptorTwo url == " + url);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("2 InterceptorTwo->postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("2 InterceptorTwo->afterCompletion");
}
}
@Slf4j
public class InterceptorThree implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURL().toString();
log.info("3 InterceptorThree url == " + url);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("3 InterceptorThree->postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("3 InterceptorThree->afterCompletion");
}
}
2.注册拦截器
将拦截器2和拦截器3注册
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new InterceptorOne());
registry.addInterceptor(new InterceptorTwo());
registry.addInterceptor(new InterceptorThree());
}
}
3.运行结果
拦截器1,2,3的preHandle方法都返回true
通过运行结果可以看出多拦截器方法执行顺序为:preHandle1->preHandle2->preHandle3->postHandle3->postHandle2->postHandle1->afterCompletion3->afterCompletion2->afterCompletion1
拦截器1,2的preHandle方法返回true,拦截器3的preHandle方法返回false
此时,三个拦截器的postHandle方法都没有执行。说明多个拦截器只要有一个拦截器的preHandle方法没有放行,那么所有的postHandle方法都不会执行。且未放行拦截器的afterCompletion方法也不会执行。
拦截器1,3的preHandle方法返回true,拦截器2的preHandle方法返回false
由运行结果可知,若拦截器2的preHandle方法没有放行,那么该拦截器的下一个拦截器,即拦截器3的所有方法都不会执行。同时,拦截器2的postHandle和afterCompletion方法也都不会执行。