SpringBoot2的拦截器(快速上手)
前言
SpringBoo2因为整合了SpringMVC,因此SpringMVC的拦截器也被SpringBoot收入囊中,拦截器(Interceptor)是SpringMVC的核心功能之一,是利用Spring的AOP的面向切面编程的思想,可以很方便的实现对登录权限控制、日志打印等功能。
1、配置拦截器
1.实现HandlerInterceptor接口
HandlerInterceptor:处理器拦截器(SpringBoot的web开发中,使用controller来处理web请求,而HandlerInterceptor用来处理controller拦截)
实现HandlerInterceptor接口中三个方法:
- preHandle:预先处理方法,返回值为false拦截,true放行,放行之后执行controller对应方法中的内容
- postHandle:controller方法返回之后执行postHandle,执行完成之后开始响应页面
- afterCompletion:当页面渲染完成之后执行afterCompletion
public class MyHandlerInterceptor implements HandlerInterceptor {
/**
* 目标方法调用之前执行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return false;
}
/**
* 目标方法调用完以后执行
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 页面渲染完以后执行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
2.继承HandlerInterceptorAdapter类(不推荐使用)
2、将拦截器注册到容器中,并指定拦截规则
以前注册拦截器要写XMl文件,现在使用javaconfig注册拦截器:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyHandlerInterceptor())
.addPathPatterns("/**") //拦截的路径
.excludePathPatterns("/login"); //排除的路径
}
}
3、多个拦截器的执行顺序
1. 默认拦截器的执行顺序
默认情况下,通过register.addInterceptor注册拦截器的顺序来确定拦截器的preHandle的执行顺序,preHandle 方法执行顺序与拦截器注册时顺序一致,postHandle 和 afterCompletion 方法执行顺序反之
2.修改拦截器的执行顺序
通过order(int order)方法设置拦截器执行的先后顺序,preHandle 方法执行顺序是按照 order 升序执行,postHandle 和 afterCompletion 方法执行顺序反之。
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new Interceptor1())
.addPathPatterns("/**")
.order(1);
registry.addInterceptor(new Interceptor2())
.addPathPatterns("/**")
.order(2);
registry.addInterceptor(new Interceptor3())
.addPathPatterns("/**")
.order(3);
}