说一下SpringBoot中注册过滤器的三种方式,你能想到哪几种?今天宋哥就和大家聊聊SpringBoot注册过滤器的三种方式!其实本来是想跟大家聊聊SpringSecurity过滤器链的问题,但是看了源码看了看就跑题了,所以就跟大家聊聊Spring注册过滤器的三种方式Boot,就是后面对SpringSecurity的调用。有点基础。1、@WebFilter通过@WebFilter注解来标记一个过滤器,大家很容易想到。这就是在SpringBoot上直接使用Servlet中的一套东西。具体方法是通过@WebFilter注解来标记一个Filter,如下:----doFilter-----");chain.doFilter(request,response);}}过滤器的拦截规则可以在@WebFilter注解中配置。为了让这个注解生效,我们还需要在项目启动类上配置@ServletComponentScan注解,如下:@SpringBootApplication@ServletComponentScanpublicclassFilterdemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(FilterdemoApplication.class,args);}}@ServletComponentScan注解虽然名字有Servlet,但实际上它不仅可以扫描项目中的Servlet容器,还可以扫描Filter和Listener。这是我们在SpringBoot中使用过滤器的第一种方式。在实际项目中,这种方式用的比较少,因为这种方式有一个很大的缺点就是无法指定Filter的优先级。如果有多个When过滤,则无法通过@Order指定优先级。2.@Bean第二种方式是将filter配置为bean,注册到Spring容器中。这个方法不再需要@ServletComponentScan注解,只需要一个Bean,如下:-");chain.doFilter(request,response);}}这个方法看起来很方便,只是一个注解,将Filter合并到Spring容器中。而且这种方式还有一个好处,就是如果有多个Filter,可以通过@Order注解指定多个Filter的优先级,如下:@Component@Order(-1)publicclassMyFilterimplementsFilter{@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{System.out.println("-----doFilter-----");chain.doFilter(request,response);}}虽然解决了优先级问题,但是大家发现这是好像没有办法设置Filter的拦截规则!是的,如果直接定义Bean,默认的拦截规则是/*,拦截所有请求,开发者无法自定义配置。那么有没有办法配置拦截规则和配置优先级呢?接下来介绍的第三种方案可以鱼和熊掌兼得。3、FilterRegistrationBean第三种方案是将Filter封装成一个Bean,但是这个Bean是一个FilterRegistrationBean。通过FilterRegistrationBean,我们可以配置Filter的优先级和Filter的拦截规则。一般在项目中,我们使用FilterRegistrationBean来配置过滤器。我们来看一个案例:@ConfigurationpublicclassFilterConfiguration{@BeanFilterRegistrationBeanmyFilterFilterRegistrationBean(){FilterRegistrationBeanbean=newFilterRegistrationBean<>();bean.setFilter(newMyFilter());bean.setOrder(-1);bean.setUrlPatterns(Arrays.asList("/*"));returnbean;}@BeanFilterRegistrationBeanmyFilterFilterRegistrationBean2(){FilterRegistrationBeanbean=newFilterRegistrationBean<>();bean.setFilter(newMyFilter2());bean.setOrder(-2);bean.setUrlPatterns(Arrays.asList("/hello"));returnbean;}}4、扩展的FilterRegistrationBean的由来是什么?分享给大家。SpringBoot为了方便大家向Servlet容器中注册Servlet、Filter以及Listener,提供了一个Bean注册的抽象类RegistrationBean,如下:publicabstractclassRegistrationBeanimplementsServletContextInitializer,Ordered{privateintorder=Ordered.LOWEST_PRECEDENCE;privatebooleanenabled=true;@OverridepublicfinalvoidonStartup(ServletContextservletContext)throwsServletException{Stringdescription=getDescription();if(!isEnabled()){logger.info(StringUtils.capitalize(description)+"wasnotregistered(disabled)");返回;}register(description,servletContext);}protectedabstractStringgetDescription();protectedabstractvoidregister(Stringdescription,ServletContextservletContext);当ServletContextInitializer接口是指定,在Servlet启动时会调用RegistrationBean#onStartup方法,然后是Filter和Servlet而Listener的registrationenabled属性可以理解为一个开关,设置为false相当于关闭组件注册。RegistrationBean有很多实现类,我们之前使用的FilterRegistrationBean只是其中一个:实现类的作用一目了然:ServletListenerRegistrationBean用于注册监听器。ServletRegistrationBean用于注册Servlet。DispatcherServletRegistrationBean用于注册DispatcherServlet。FilterRegistrationBean用于注册过滤器。DelegatingFilterProxyRegistrationBean用于注册DelegatingFilterProxy,在集成SpringSecurity、SpringSession、Shiro等时非常有用。5.总结今天给大家分享一下SpringBoot中过滤器的三种注册方式。顺便给大家分享一下FilterRegistrationBean的继承体系。大家可以根据FilterRegistrationBean的继承体系中的实现类自行尝试。如何注册Servlet和Listener~本文案例下载地址:https://github.com/lenve/javaboy-code-samples转载本文请联系江南一点鱼公众号。