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() { } }; }
說明:
第二種和第三種類似,均實現了AbstractFilterRegistrationBean接口,而該接口間接實現了ServletContextInitializer,springboot在啟動容器后會查找實現該接口的bean,并調用**onStartup()**方法添加自定義的Filter,兩則的區(qū)別 DelegatingFilterProxyRegistrationBean 通過傳入的proxyFilter名字,在WebApplicationContext查找該Fillter Bean,并通過DelegatingFilterProxy生成基于該Bean的代理Filter對象,
而FilterRegistrationBean 則是直接設置一個Filter,因此該Filter可以有spring容器管理,也可不用spring管理
注意:如果Filter聲明為一個Bean,則不需要定義為FilterRegistrationBean,也會被spring發(fā)現并添加,就是方法四,該方式無法定義攔截規(guī)則等,默認全局,慎用!
注入自定義Filter
直接舉個例子,我現在想實現一個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("該人以及訪問結束"); } }
這里我雖然自定義了一個Filter,但是是無法掃描到的。
有兩種方式可以解決這個,一個是在啟動類增加
@ServletComponentScan
這個注解不管是Filter還是Servlet都適用
另一種方式就是通過注入
FilterRegistrationBean
如下:
@Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new AdminFilter()); filterRegistrationBean.addUrlPatterns("/admin/*"); return filterRegistrationBean; }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springBoot+mybaties后端多層架構的實現示例
本文主要介紹了springBoot+mybaties后端多層架構的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07java ThreadPool線程池的使用,線程池工具類用法說明
這篇文章主要介紹了java ThreadPool線程池的使用,線程池工具類用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10