在springboot中注入FilterRegistrationBean不生效的原因
springboot注入FilterRegistrationBean不生效
回顧
最近自定義了兩個過濾器,接口請求返回加密和sql注入處理過濾器,因為在封裝一些工具包,我在單獨調(diào)好之后,就打算做成一個注解,像springboot啟動類上加@EnableScheduling一樣,可以隨意控制,當(dāng)我不想讓這倆過濾器生效的時候,那就不加這個注解就可以了。
當(dāng)然我想到了FilterRegistrationBean的使用方法,注入這兩個過濾器。
但是當(dāng)我寫完之后,打成包之后,發(fā)現(xiàn)只有sql注入過濾器生效。
原因
原因就是我通過@Bean注解注入FilterRegistrationBean時,沒有對它們起別名,造成沖突,只能注入一個。
我的工程里,寫了兩個下邊的方法:
注入加密過濾器
/** * @return 注入加密過濾器 */ @Bean public FilterRegistrationBean filterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new EncryptionFilter()); registration.addUrlPatterns("/*"); registration.setName("encryptionFilter"); registration.setOrder(1); return registration; }
注入sql注入過濾器
/** * @return 注入加密過濾器 */ @Bean public FilterRegistrationBean filterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new SqlInjectManagerFilter()); registration.addUrlPatterns("/*"); registration.setName("sqlInjectManagerFilter"); registration.setOrder(2); return registration; }
這個問題雖然簡單,但是確實影響到我思路了,我最初一直在考慮是不是我做的springboot啟動類加注解觸發(fā)過濾器注入的方式不對,也是因為我看了下@EnableTransactionManagement的注入方式,我差點就懷疑@Import在打成工具包后不能多個使用的問題。尷尬~~~
當(dāng)我一比較這倆方法的時候,我才懷疑到名字沖突了。因此就分別對它們加了名稱如下:
/** * @return 注入加密過濾器 */ @Bean(name = "encryptionFilter") public FilterRegistrationBean filterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new EncryptionFilter()); registration.addUrlPatterns("/*"); registration.setName("encryptionFilter"); registration.setOrder(1); return registration; }
/** * @return 注入加密過濾器 */ @Bean(name = "sqlInjectManagerFilter") public FilterRegistrationBean filterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new SqlInjectManagerFilter()); registration.addUrlPatterns("/*"); registration.setName("sqlInjectManagerFilter"); registration.setOrder(2); return registration; }
springboot @webfilter FilterRegistrationBean「T」
1、@webfilter過濾指定url
在啟動類加注解@ServletComponentScan
2、Filter類:
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; @WebFilter(urlPatterns="/task") public class DemoFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Filter demo task"); chain.doFilter(request, response); } @Override public void destroy() { } }
3、@webfilter過濾全部路徑
在filter類上加 @Component 或 @Configuration 注解:
4、FilterRegistrationBean<T> 過濾指定url 或 全部路徑
直接在FilterRegistrationBean<T>中配置即可:
import org.apache.catalina.filters.RemoteIpFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @Configuration public class ConfigurationFilter { @Bean public RemoteIpFilter remoteIpFilter() { return new RemoteIpFilter(); } @Bean public FilterRegistrationBean<MyFilter> testFilterRegistration() { FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<MyFilter>(); registration.setFilter(new MyFilter());//添加過濾器 registration.addUrlPatterns("/user");//設(shè)置過濾路徑,/*所有路徑 //registration.addInitParameter("name", "alue");//添加默認(rèn)參數(shù) registration.setName("MyFilter");//設(shè)置優(yōu)先級 registration.setOrder(2);//設(shè)置優(yōu)先級 return registration; } public class MyFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) srequest; System.out.println("this is MyFilter,url :" + request.getRequestURI()); filterChain.doFilter(srequest, sresponse); } @Override public void init(FilterConfig arg0) throws ServletException { } } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實現(xiàn)駝峰和下劃線互相轉(zhuǎn)換的示例代碼
Java對各種變量、方法和類等要素命名時使用的字符序列稱為標(biāo)識符,凡是自己可以起名字的地方都叫標(biāo)識符。本文為大家分享了Java中如何實現(xiàn)駝峰命名與下劃線命名的互轉(zhuǎn),感興趣的可以了解一下2022-05-05Java數(shù)據(jù)結(jié)構(gòu)之Map與Set專篇講解
這篇文章通過實例面試題目來講解Java中Map和Set之間的關(guān)系,具有很好的參考價值,Map與Set在面試中經(jīng)常會遇到。一起跟隨小編過來看看吧2022-01-01Spring?cloud網(wǎng)關(guān)gateway進行websocket路由轉(zhuǎn)發(fā)規(guī)則配置過程
這篇文章主要介紹了Spring?cloud網(wǎng)關(guān)gateway進行websocket路由轉(zhuǎn)發(fā)規(guī)則配置過程,文中還通過實例代碼介紹了Spring?Cloud?Gateway--配置路由的方法,需要的朋友可以參考下2023-04-04idea沒有services窗口、沒有springboot啟動項問題
這篇文章主要介紹了idea沒有services窗口、沒有springboot啟動項問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05IDEA設(shè)置Maven自動編譯model的實現(xiàn)方法
本文主要介紹了IDEA設(shè)置Maven自動編譯model的實現(xiàn)方法, maven結(jié)構(gòu)的項目,我們在每次修改代碼后都會需要手動編譯,本文就可以解決這個問題,感興趣的可以了解一下2023-08-08