作者:Melody-Zhu1988 | 来源:互联网 | 2023-06-12 16:54
相关文章:SpringBoot之AOP切面的使用SpringBoot之Listener注册到Spring容器中的多种方法SpringBoot之Filter过滤器的实现
相关文章: SpringBoot 之AOP切面的使用 SpringBoot之Listener注册到Spring容器中的多种方法 SpringBoot之Filter过滤器的实现及排序问题 SpringBoot 之多个过滤器(Filter) ,监听器(Listener),切面(AOP),拦截器(Interceptor)的指定排序问题总结篇
springboot中实现拦截器方式 实现方式 实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter 抽象类
两者区别 HandlerInterceptorAdapter 实现AsyncHandlerInterceptor接口,AsyncHandlerInterceptor接口 继承HandlerInterceptor接口。AsyncHandlerInterceptor接口多了一个afterConcurrentHandlingStarted方法
创建一个拦截器实现HandlerInterceptor接口 在jdk1.8之后,只需要实现自己需要的方法。因为接口有默认实现。
@Component public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle ( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System. out. println ( "方法开始前拦截........." ) ; return false ; } @Override public void postHandle ( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System. out. println ( "方法返回后拦截........." ) ; } @Override public void afterCompletion ( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System. out. println ( "方法结束后拦截........." ) ; } }
创建一个拦截器继承HandlerInterceptorAdapter类 @Component public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle ( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System. out. println ( "方法开始前拦截........." ) ; return false ; } @Override public void postHandle ( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System. out. println ( "方法返回后拦截........." ) ; } @Override public void afterCompletion ( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System. out. println ( "方法结束后拦截........." ) ; } @Override public void afterConcurrentHandlingStarted ( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System. out. println ( "do something........." ) ; super . afterConcurrentHandlingStarted ( request, response, handler) ; } }
创建配置类来管理拦截器,并将之前的拦截器注入其中 两种方式,实现 WebMvcConfigurer 或者继承 WebMvcConfigurationSupport 两者没什么区别,看项目的选择。
@Configuration public class MvcInterceptorConfig extends WebMvcConfigurationSupport { @Autowired private LoginInterceptor loginInterceptor; @Override protected void addInterceptors ( InterceptorRegistry registry) { registry. addInterceptor ( loginInterceptor) . addPathPatterns ( "/**" ) . excludePathPatterns ( "/stuInfo/getAllStuInfoA" , "/account/register" ) ; } }
多个拦截器执行顺序 多个拦截器的执行顺序按照你的代码代码添加顺序,先添加后执行。
在未设置order方法值时: registry. addInterceptor ( repeatPutInterceptor) registry. addInterceptor ( refererInterceptor) registry. addInterceptor ( loginAuthInterceptor)
针对于preHandle 执行顺序为:1->2->3 针对于postHandle执行顺序为:3->2->1 针对于afterCompletion执行顺序为:3->2->1
设置order值时:此时能实现自定义顺序 registry. addInterceptor ( repeatPutInterceptor) . order ( 1 ) registry. addInterceptor ( loginAuthInterceptor) . order ( 3 ) registry. addInterceptor ( refererInterceptor) . order ( 2 )
针对于preHandle 执行顺序为:1->3->2 针对于postHandle执行顺序为:2->3->1 针对于afterCompletion执行顺序为:2->3->1
源码出处&#xff1a;InterceptorRegistry类 protected List< Object> getInterceptors ( ) { return this . registrations. stream ( ) . sorted ( INTERCEPTOR_ORDER_COMPARATOR) . map ( InterceptorRegistration: : getInterceptor) . collect ( Collectors. toList ( ) ) ; } private static final Comparator< Object> INTERCEPTOR_ORDER_COMPARATOR &#61; OrderComparator. INSTANCE. withSourceProvider ( object - > { if ( object instanceof InterceptorRegistration ) { return ( Ordered) ( ( InterceptorRegistration) object) : : getOrder; } return null; } ) ;
排序问题 添加&#64;order注解&#xff0c;和实现Ordered 接口都无法实现自定义顺序的。只能在配置类中注入拦截器的时候添加order或者使用代码顺序来自定义排序