SpringBoot項目@WebFilter過濾器urlPatterns配置失效的解決方案,以及多個filter過濾器demo


版本說明: spring-boot-starter-parent   2.1.11.RELEASE

1:定義兩個filter過濾器類

public class MyFilter1 implements Filter {
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException { 
       // todo XXX
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

再定義第二個過濾器 MyFilter2,代碼同上。 注意:不添加任何注解!

2:filter注冊為一個bean

在SpringBoot啟動類里添加@Configuration 注解,這可以讓SpringBoot認得@Bean注解。然后啟動類里添加如下代碼:

@Bean
    MyFilter1 getApiAuthenticationFilter1(){
        return new MyFilter1();
    }

    @Bean("myFilter1RegistrationBeanName")
    public FilterRegistrationBean<MyFilter1> registerFilter1(MyFilter1 myFilter1) {
        FilterRegistrationBean<MyFilter1> registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(myFilter1);
        registrationBean.addUrlPatterns("/account/*"); //url攔截
        registrationBean.setOrder(1);
        registrationBean.setAsyncSupported(true);
        return registrationBean;
    }

    @Bean //這里特意注冊為一個bean,是可以讓spring容器在filter類里注入@Autowited字段
    MyFilter2 getInnerApiAuthFilter1(){
        return new MyFilter2();
    }

    @Bean("myFilter2RegistrationBeanName") //注意,如果是多個filter,一定要給bean命名不通的名字
    public FilterRegistrationBean<MyFilter2> registerFilter2(MyFilter2 myFilter2) { //傳參方式而非new對象的方式,可以從spring容器里得到bean對象
        FilterRegistrationBean<MyFilter2> registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(myFilter2);
        registrationBean.addUrlPatterns("/api/*");
        registrationBean.setOrder(2);
        registrationBean.setAsyncSupported(true);
        return registrationBean;
    }

3:修改log日志打印級別為debug

在application.properties配置文件中,添加日志級別配置:logging.level.org.springframework.boot=debug

 

4:日志打印驗證url攔截

 

2020-01-02 19:35:19.125 DEBUG 61918 [main] o.s.b.w.s.ServletContextInitializerBeans : Mapping filters: springSecurityFilterChain urls=[/*], 
          filterRegistrationBean urls=[/account/*], filterRegistrationBean urls=[/api/*], characterEncodingFilter urls=[/*] 2020-01-02 19:35:19.125 DEBUG 61918 [main] o.s.b.w.s.ServletContextInitializerBeans : Mapping servlets: dispatcherServlet urls=[/],
          messageDispatcherServlet urls=[/services/*]

 

從以上日志打印可以看出url攔截已經生效了。

以上代碼親測驗證有效。

至於controller的代碼攔截試驗,此處不方便貼出,請大家各自驗證。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM