在springboot中注入FilterRegistrationBean不生效的原因
springboot注入FilterRegistrationBean不生效
回顧
最近自定義了兩個(gè)過濾器,接口請求返回加密和sql注入處理過濾器,因?yàn)樵诜庋b一些工具包,我在單獨(dú)調(diào)好之后,就打算做成一個(gè)注解,像springboot啟動類上加@EnableScheduling一樣,可以隨意控制,當(dāng)我不想讓這倆過濾器生效的時(shí)候,那就不加這個(gè)注解就可以了。
當(dāng)然我想到了FilterRegistrationBean的使用方法,注入這兩個(gè)過濾器。
但是當(dāng)我寫完之后,打成包之后,發(fā)現(xiàn)只有sql注入過濾器生效。
原因
原因就是我通過@Bean注解注入FilterRegistrationBean時(shí),沒有對它們起別名,造成沖突,只能注入一個(gè)。
我的工程里,寫了兩個(gè)下邊的方法:
注入加密過濾器
/**
* @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;
}
這個(gè)問題雖然簡單,但是確實(shí)影響到我思路了,我最初一直在考慮是不是我做的springboot啟動類加注解觸發(fā)過濾器注入的方式不對,也是因?yàn)槲铱戳讼翤EnableTransactionManagement的注入方式,我差點(diǎn)就懷疑@Import在打成工具包后不能多個(gè)使用的問題。尷尬~~~
當(dāng)我一比較這倆方法的時(shí)候,我才懷疑到名字沖突了。因此就分別對它們加了名稱如下:
/**
* @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 {
}
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb 文件的上傳和下載功能簡單實(shí)現(xiàn)代碼
這篇文章主要介紹了JavaWeb 文件的上傳和下載功能簡單實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-04-04
基于SpringCloud手寫一個(gè)簡易版Sentinel
SpringCloud Alibaba Sentinel是當(dāng)前最為流行一種熔斷降級框架,簡單易用的方式可以快速幫助我們實(shí)現(xiàn)服務(wù)的限流和降級,保證服務(wù)的穩(wěn)定性。2021-05-05
Java中將 int[] 數(shù)組 轉(zhuǎn)換為 List分享
這篇文章主要介紹了Java中將 int[] 數(shù)組 轉(zhuǎn)換為 List分享的相關(guān)資料,需要的朋友可以參考下2022-12-12
springboot讀取自定義配置文件節(jié)點(diǎn)的方法
這篇文章主要介紹了springboot讀取自定義配置文件節(jié)點(diǎn)的方法,本文給大家介紹的非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-05-05

