相关文章:
SpringBoot 之AOP切面的使用
SpringBoot之Listener注册到Spring容器中的多种方法
SpringBoot之Interceptor拦截器注入使用
SpringBoot之Filter过滤器的实现及排序问题
过滤器(Filter) ,监听器(Listener)
这两个实现排序是一样的。
无法通过Ordered接口,@Order注解实现排序,只能使用以下方法
使用@WebFilter,@WebListener
@WebFilter,@WebListener没有提供 order参数,只能通过类名进行排序
比如:
Filter1,Filter2,Filter3 这三个Filter依次执行。Listener1,Listener2,Listener3 这三个Listener依次执行。
使用FilterRegistrationBean / ServletListenerRegistrationBean
FilterRegistrationBean/ServletListenerRegistrationBean最终继承了RegistrationBean 提供了setOrder方法。
@Configurationpublic class FilterConfig {@Beanpublic FilterRegistrationBean LoginFilter(){FilterRegistrationBean registrationBean = new FilterRegistrationBean();registrationBean.setFilter(new LoginFilter());registrationBean.addInitParameter("test","true");registrationBean.addInitParameter("test1", "test");registrationBean.addUrlPatterns("/*");registrationBean.setOrder(1); // 设置排序registrationBean.setDispatcherTypes(DispatcherType.REQUEST);return registrationBean;}}@Configurationpublic class ListenerConfig {@Beanpublic ServletListenerRegistrationBean configContextListener() {ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean();bean.setListener(new ConfigContextListener());return bean;}}
切面(AOP)
第一种:实现Ordered接口,数值越小越先执行
第二种,@order注解,数值越小越先执行
拦截器(Interceptor)
只能在配置文件中实现。设置@Order注解和实现Ordered接口也都是不行的。
@Configurationpublic class MvcInterceptorConfig extends WebMvcConfigurationSupport {@Autowiredprivate LoginInterceptor loginInterceptor;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 多个拦截器组成一个拦截器链// addPathPatterns 用于添加拦截规则,/**表示拦截所有请求// excludePathPatterns 用户排除拦截registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/stuInfo/getAllStuInfoA","/account/register"); }}
在未设置order方法值时,通过拦截器添加顺序控制:
registry.addInterceptor(repeatPutInterceptor) // 1registry.addInterceptor(refererInterceptor) // 2registry.addInterceptor(loginAuthInterceptor) //3
针对于preHandle 执行顺序为:1->2->3
针对于postHandle执行顺序为:3->2->1
针对于afterCompletion执行顺序为:3->2->1
设置order值时:此时能实现自定义顺序
registry.addInterceptor(repeatPutInterceptor).order(1) // 1registry.addInterceptor(loginAuthInterceptor).order(3) //2registry.addInterceptor(refererInterceptor).order(2) // 3
针对于preHandle 执行顺序为:1->3->2
针对于postHandle执行顺序为:2->3->1
针对于afterCompletion执行顺序为:2->3->1
源码出处: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 =OrderComparator.INSTANCE.withSourceProvider(object -> {if (object instanceof InterceptorRegistration) {return (Ordered) ((InterceptorRegistration) object)::getOrder;}return null;});
SpringBoot 之多个过滤器(Filter) 监听器(Listener) 切面(AOP) 拦截器(Interceptor)的指定排序问题总结篇