Spring Boot之過(guò)濾器 Filter注入的方式解析
過(guò)濾器 Filter注入的方式
第一種
@WebFilter(filterName = "myFilter",urlPatterns = "/*") public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { } @Override public void destroy() { } } @SpringBootApplication @EnableAutoConfiguration @EnableWebMvc @ServletComponentScan(basePackages = "com.fanyin.eghm") public class EghmApplication { public static void main(String[] args) { SpringApplication.run(EghmApplication.class, args); } }
@ServletComponentScan 所掃描的包路徑必須包含該Filter
第二種
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new MyFilter2()); bean.addUrlPatterns("/*"); return bean; } }
第三種
@Bean("proxyFilter") public Filter filter (){ return new Filter() { @Override public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { } @Override public void destroy() { } }; } @Bean public DelegatingFilterProxyRegistrationBean delegatingFilterProxyRegistrationBean(){ DelegatingFilterProxyRegistrationBean bean = new DelegatingFilterProxyRegistrationBean("proxyFilter"); bean.addUrlPatterns("/*"); return bean; }
方法四
@Bean("myFilter") public Filter filter (){ return new Filter() { @Override public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { } @Override public void destroy() { } }; }
說(shuō)明:
第二種和第三種類似,均實(shí)現(xiàn)了AbstractFilterRegistrationBean接口,而該接口間接實(shí)現(xiàn)了ServletContextInitializer,springboot在啟動(dòng)容器后會(huì)查找實(shí)現(xiàn)該接口的bean,并調(diào)用**onStartup()**方法添加自定義的Filter,兩則的區(qū)別 DelegatingFilterProxyRegistrationBean 通過(guò)傳入的proxyFilter名字,在WebApplicationContext查找該Fillter Bean,并通過(guò)DelegatingFilterProxy生成基于該Bean的代理Filter對(duì)象,
而FilterRegistrationBean 則是直接設(shè)置一個(gè)Filter,因此該Filter可以有spring容器管理,也可不用spring管理
注意:如果Filter聲明為一個(gè)Bean,則不需要定義為FilterRegistrationBean,也會(huì)被spring發(fā)現(xiàn)并添加,就是方法四,該方式無(wú)法定義攔截規(guī)則等,默認(rèn)全局,慎用!
注入自定義Filter
直接舉個(gè)例子,我現(xiàn)在想實(shí)現(xiàn)一個(gè)Filter,過(guò)濾所有訪問(wèn)/admin前綴的請(qǐng)求
public class AdminFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("此時(shí)有人訪問(wèn)admin"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("該人以及訪問(wèn)結(jié)束"); } }
這里我雖然自定義了一個(gè)Filter,但是是無(wú)法掃描到的。
有兩種方式可以解決這個(gè),一個(gè)是在啟動(dòng)類增加
@ServletComponentScan
這個(gè)注解不管是Filter還是Servlet都適用
另一種方式就是通過(guò)注入
FilterRegistrationBean
如下:
@Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new AdminFilter()); filterRegistrationBean.addUrlPatterns("/admin/*"); return filterRegistrationBean; }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之線段樹(shù)中的懶操作詳解
對(duì)于線段樹(shù),若要求對(duì)區(qū)間中的所有點(diǎn)都進(jìn)行更新,可以引入懶操作。懶操作包括區(qū)間更新和區(qū)間查詢操作。本文將通過(guò)一個(gè)示例和大家詳細(xì)聊聊線段樹(shù)中的懶操作,需要的可以參考一下2022-10-10Java使用設(shè)計(jì)模式中迭代器模式構(gòu)建項(xiàng)目的代碼結(jié)構(gòu)示例
這篇文章主要介紹了Java使用設(shè)計(jì)模式中迭代器模式構(gòu)建項(xiàng)目的代碼結(jié)構(gòu)示例,迭代器模式能夠?qū)υL問(wèn)者隱藏對(duì)象的內(nèi)部細(xì)節(jié),需要的朋友可以參考下2016-05-05springBoot+mybaties后端多層架構(gòu)的實(shí)現(xiàn)示例
本文主要介紹了springBoot+mybaties后端多層架構(gòu)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Java對(duì)時(shí)間的簡(jiǎn)單操作實(shí)例
這篇文章主要介紹了Java對(duì)時(shí)間的簡(jiǎn)單操作,實(shí)例分析了針對(duì)java.util.Date的各類常見(jiàn)操作,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01詳解Java如何通過(guò)Socket實(shí)現(xiàn)查詢IP
在本文中,我們來(lái)學(xué)習(xí)下如何找到連接到服務(wù)器的客戶端計(jì)算機(jī)的IP地址。我們將創(chuàng)建一個(gè)簡(jiǎn)單的客戶端-服務(wù)器場(chǎng)景,讓我們探索用于TCP/IP通信的java.net?API,感興趣的可以了解一下2022-10-10Java程序運(yùn)行之JDK,指令javac java解讀
這篇文章主要介紹了Java程序運(yùn)行之JDK,指令javac java,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01java ThreadPool線程池的使用,線程池工具類用法說(shuō)明
這篇文章主要介紹了java ThreadPool線程池的使用,線程池工具類用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10