本文記錄一下在SpringBoot項目中是如何使用Filter過濾器html
Filter過濾器是servlet包下面的東西,所以咱們不須要再額外引包java
直接實現Filter接口,並使用@Component註解標註爲組件自動注入beangit
package cn.huanzi.qch.springbootfilter.filter; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class TestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; System.out.println("TestFilter,"+request.getRequestURI()); //執行 filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }
查看日誌能夠發現,SpringBoot已經幫咱們注入了一個filter,攔截路徑是/*,攔截全部,若是咱們須要進一步攔截具體的則須要咱們本身在代碼裏控制github
實現Filter接口,用@WebFilter註解,指定攔截路徑以及一些參數,同時須要在啓動類使用@ServletComponentScan掃描帶@WebFilter、@WebServlet、@WebListener並將幫咱們注入bean
web
package cn.huanzi.qch.springbootfilter.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; //配置攔截路徑 @WebFilter(filterName = "testFilter",urlPatterns = {"/test"}) public class TestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; System.out.println("TestFilter,"+request.getRequestURI()); //執行 filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }
package cn.huanzi.qch.springbootfilter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; //自動掃描與當前類的同包以及子包 @ServletComponentScan @SpringBootApplication public class SpringbootFilterApplication { public static void main(String[] args) { SpringApplication.run(SpringbootFilterApplication.class, args); } }
查看日誌發現,以及幫咱們注入了testFilter,攔截路徑是/testspringboot
只指定攔截路徑,不設置filterName同樣能夠注入ide
//配置攔截路徑 @WebFilter({"/test"})
固然了,咱們也能夠既使用@Component同時也使用@WebFilterspring-boot
package cn.huanzi.qch.springbootfilter.filter; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; //配置攔截路徑 @WebFilter(filterName = "testFilter",urlPatterns = {"/test"}) @Component public class TestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; System.out.println("TestFilter,"+request.getRequestURI()); //執行 filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }
package cn.huanzi.qch.springbootfilter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; //自動掃描與當前類的同包以及子包 @ServletComponentScan @SpringBootApplication public class SpringbootFilterApplication { public static void main(String[] args) { SpringApplication.run(SpringbootFilterApplication.class, args); } }
可是作會注入兩個bean,若是你的@WebFilter沒有指定filterName或者指定的名稱與類名相同,因爲注入兩個相同名稱的bean,程序啓動報錯,叫咱們修改其中一個的名字,或者啓用覆蓋bean測試
這裏建議若是你硬要採用第三種方法,最好啓用覆蓋,由於更名將會注入兩個bean,處理邏輯同樣但攔截路徑不同,這並非咱們想要的,例如:
啓用覆蓋
#啓用覆蓋同名bean spring.main.allow-bean-definition-overriding=true
PS:這裏額外說一點,若是咱們採用第三種方法,@ServletComponentScan放在TestFilter類上@WebFilter也會被掃描到,不須要放在啓動類,第二種方法若是也這樣作就不行,估計是受到了@Component註解的影響
//配置攔截路徑 @WebFilter(filterName = "testFilter",urlPatterns = {"/test"}) @ServletComponentScan @Component public class TestFilter implements Filter
Filter過濾器暫時先記錄到這,之後再進行補充
代碼已經開源、託管到個人GitHub、碼雲: