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ī)則等,默認(rèn)全局,慎用!
注入自定義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)文章
swagger文檔增強(qiáng)工具knife4j使用圖文詳解
這篇文章主要介紹了swagger文檔增強(qiáng)工具knife4j使用詳解,想要使用knife4j非常簡單,只要在Springboot項目中引入knife4j的依賴即可,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
深入淺出的學(xué)習(xí)Java ThreadLocal
本文會基于實際場景介紹ThreadLocal如何使用以及內(nèi)部實現(xiàn)機(jī)制。 具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02
Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實例
這篇文章主要介紹了Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實例,本文講解了創(chuàng)建Socket、Socket發(fā)送數(shù)據(jù)、Socket讀取數(shù)據(jù)、關(guān)閉Socket等內(nèi)容,都是最基礎(chǔ)的知識點(diǎn),需要的朋友可以參考下2014-09-09
MyBatis-Plus 分頁查詢以及自定義sql分頁的實現(xiàn)
這篇文章主要介紹了MyBatis-Plus 分頁查詢以及自定義sql分頁的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

