Spring Boot之過濾器 Filter注入的方式解析
過濾器 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() { } }; }
說明:
第二種和第三種類似,均實現(xiàn)了AbstractFilterRegistrationBean接口,而該接口間接實現(xiàn)了ServletContextInitializer,springboot在啟動容器后會查找實現(xiàn)該接口的bean,并調(diào)用**onStartup()**方法添加自定義的Filter,兩則的區(qū)別 DelegatingFilterProxyRegistrationBean 通過傳入的proxyFilter名字,在WebApplicationContext查找該Fillter Bean,并通過DelegatingFilterProxy生成基于該Bean的代理Filter對象,
而FilterRegistrationBean 則是直接設(shè)置一個Filter,因此該Filter可以有spring容器管理,也可不用spring管理
注意:如果Filter聲明為一個Bean,則不需要定義為FilterRegistrationBean,也會被spring發(fā)現(xiàn)并添加,就是方法四,該方式無法定義攔截規(guī)則等,默認全局,慎用!
注入自定義Filter
直接舉個例子,我現(xiàn)在想實現(xiàn)一個Filter,過濾所有訪問/admin前綴的請求
public class AdminFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("此時有人訪問admin"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("該人以及訪問結(jié)束"); } }
這里我雖然自定義了一個Filter,但是是無法掃描到的。
有兩種方式可以解決這個,一個是在啟動類增加
@ServletComponentScan
這個注解不管是Filter還是Servlet都適用
另一種方式就是通過注入
FilterRegistrationBean
如下:
@Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new AdminFilter()); filterRegistrationBean.addUrlPatterns("/admin/*"); return filterRegistrationBean; }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之線段樹中的懶操作詳解
對于線段樹,若要求對區(qū)間中的所有點都進行更新,可以引入懶操作。懶操作包括區(qū)間更新和區(qū)間查詢操作。本文將通過一個示例和大家詳細聊聊線段樹中的懶操作,需要的可以參考一下2022-10-10Java使用設(shè)計模式中迭代器模式構(gòu)建項目的代碼結(jié)構(gòu)示例
這篇文章主要介紹了Java使用設(shè)計模式中迭代器模式構(gòu)建項目的代碼結(jié)構(gòu)示例,迭代器模式能夠?qū)υL問者隱藏對象的內(nèi)部細節(jié),需要的朋友可以參考下2016-05-05springBoot+mybaties后端多層架構(gòu)的實現(xiàn)示例
本文主要介紹了springBoot+mybaties后端多層架構(gòu)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07java ThreadPool線程池的使用,線程池工具類用法說明
這篇文章主要介紹了java ThreadPool線程池的使用,線程池工具類用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10