1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > SpringBoot 之多个过滤器(Filter) 监听器(Listener) 切面(AOP) 拦截器(I

SpringBoot 之多个过滤器(Filter) 监听器(Listener) 切面(AOP) 拦截器(I

时间:2024-01-28 01:57:32

相关推荐

SpringBoot 之多个过滤器(Filter)  监听器(Listener) 切面(AOP) 拦截器(I

相关文章:

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)的指定排序问题总结篇

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。