spring boot過濾器FilterRegistrationBean


spring boot過濾器FilterRegistrationBean

有2種方式可以實現過濾器

1:通過FilterRegistrationBean實例注冊

2:通過@WebFilter注解生效

這里選擇第一種,因為第二種不能設置過濾器之間的優先級

為了演示優先級,這里創建2個測試過濾器類:Test1FilterTest2Filter

通過實現javax.servlet.Filter接口,覆蓋其doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)方法,決定攔截或放行

復制代碼
public class Test1Filter implements Filter {

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest request=(HttpServletRequest)arg0;
        System.out.println("自定義過濾器filter1觸發,攔截url:"+request.getRequestURI());
        arg2.doFilter(arg0,arg1);
    }

}
復制代碼
復制代碼
public class Test2Filter implements Filter {

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest request=(HttpServletRequest)arg0;
        System.out.println("自定義過濾器filter2觸發,攔截url:"+request.getRequestURI());
        arg2.doFilter(arg0,arg1);
    }

}
復制代碼

通過在springboot的configuration中配置不同的FilterRegistrationBean實例,來注冊自定義過濾器

這里創建一個configuration類

復制代碼
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.example.demo.filter.Test1Filter;
import com.example.demo.filter.Test2Filter;

@Configuration
public class DemoConfiguration {

    @Bean
    public FilterRegistrationBean<Test1Filter> RegistTest1(){
        //通過FilterRegistrationBean實例設置優先級可以生效
        //通過@WebFilter無效
        FilterRegistrationBean<Test1Filter> bean = new FilterRegistrationBean<Test1Filter>();
        bean.setFilter(new Test1Filter());//注冊自定義過濾器
        bean.setName("flilter1");//過濾器名稱
        bean.addUrlPatterns("/*");//過濾所有路徑
        bean.setOrder(1);//優先級,最頂級
        return bean;
    }
    @Bean
    public FilterRegistrationBean<Test2Filter> RegistTest2(){
        //通過FilterRegistrationBean實例設置優先級可以生效
        //通過@WebFilter無效
        FilterRegistrationBean<Test2Filter> bean = new FilterRegistrationBean<Test2Filter>();
        bean.setFilter(new Test2Filter());//注冊自定義過濾器
        bean.setName("flilter2");//過濾器名稱
        bean.addUrlPatterns("/test/*");//過濾所有路徑
        bean.setOrder(6);//優先級,越低越優先
        return bean;
    }
}
復制代碼

其中

1第一個bean攔截所有路徑,而第二個只攔截/test/*路徑

2第一個bean優先級設置了1,而第二個設置了6,越低越優先,所以過濾器1應該在過濾器2前面攔截

運行springboot,訪問/test/*請求如下圖,再訪問/v請求如下圖只攔截了過濾器1,而過濾器2路徑不匹配

 

 

 如果把.addUrlPatterns();中攔截路徑改成一樣/test/*,則所有請求,都會觸發2個過濾器,而且過濾器1永遠在最先攔截

 


免責聲明!

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



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