Spring Boot Filter 過濾器的使用方式
前言:
要想使用 filter,需要寫一個方法繼承 Filter 類,我們寫如下兩個自己的 Filter 類,首先是 FirstFilter
類,其中 @Order
里邊的數字越小代表越先被該 Filter 過濾,@WebFilter
代表這是個 Filter 類并把這個類注入到容器中:
/**** imports ****/ @Order(1) @WebFilter(filterName="firstFilter", urlPatterns="/*") public class FirstFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("first filter 1"); chain.doFilter(request, response); System.out.println("first filter 2"); } @Override public void destroy() { } }
然后是第二個 Filter,SecondFilter
類:
/**** imports ****/ @Order(2) @WebFilter(filterName="secondFilter", urlPatterns="/*") public class SecondFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("second filter 1"); System.out.println("before:" + response); chain.doFilter(request, response); System.out.println("after:" + response); System.out.println("second filter 2"); } @Override public void destroy() { } }
然后我們把 Controller
類也寫出來:
/**** imports ****/ @RestController public class TestController { @GetMapping("/test1") public String test1() { System.out.println("method in controller"); return "test1"; } }
最后是 Spring Boot 的主方法入口,注意,由于我們使用注解注入的 Filter,所以要在下邊這個 Application 類中加入@ServletComponentScan
注解:
/**** imports ****/ @SpringBootApplication @ServletComponentScan public class ExecutorTestApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(ExecutorTestApplication.class, args); } }
首先我們先來看一下執(zhí)行結果,啟動后訪問 127.0.0.1:8080/test1
,在后臺中打印如下信息:
我們可以看出代碼執(zhí)行的流程:
- 請求被 firstFilter 截獲,打印出 first filter 1
- 執(zhí)行 chain.doFilter(request, response),這句話代表著請求會轉發(fā)給過濾器鏈上下一個對象,也就是 secondFilter,所以打印出 secondFilter 里的 second filter 1
- 執(zhí)行 secondfilter 里的 chain.dofilter() 方法,請求再轉發(fā)給下一個對象,由于沒有其他的 filter 了,所以會轉發(fā)給 controller,打印出了 controller 類中的 method in controller
- 內存棧里調用 secondFilter 的 print("second filter 2")
- 內存棧里調用 firstfilter 的 print("first filter 1")
所以如果在自己實現的 Filter 類的 doFilter 方法里不加 chain.doFilter(req, rep) 是不行的,那樣會導致請求到了這個 filter 里就不再往下走了,永遠進不了 controller 中。
我們也可以在 print("before:" + response) 和 print("after:" + response) 這兩個地方打上斷點,然后調試一下,會發(fā)現在 before 那里的 response 里是什么都么有的,而在 after 那里的 response 里則是已經有了 test1 字符串,也就是說 controller 類 test1 方法的返回值已經添加進了 response,所以如果想要對請求的 response 做一下過濾處理,那么要在 chain.doFilter(res, rep) 之后寫你的邏輯。
到此這篇關于Spring Boot Filter 過濾器的使用方式的文章就介紹到這了,更多相關Spring Boot Filter 過濾器 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java通過在主循環(huán)中判斷Boolean來停止線程的方法示例
這篇文章主要介紹了Java通過在主循環(huán)中判斷Boolean來停止線程的方法,結合具體實例形式分析了java針對線程的判斷與停止操作相關實現技巧,需要的朋友可以參考下2017-04-04在CentOS系統(tǒng)上安裝Java的openjdk的方法
這篇文章主要介紹了在CentOS系統(tǒng)上安裝Java的openjdk的方法,同樣適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下2015-06-06