springboot 通過@WebFilter(urlPatterns )配置Filter過濾路徑,沒有配置/*,輸入任何路徑都能進過濾器 2019年04月25日 12:51:33 peigui.huang 閱讀數 1005 版權聲明:本文為博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/huangpeigui/article/details/89513769 @Slf4j @Component @ServletComponentScan @WebFilter(urlPatterns = {"/config/*","/driver/*","/order/*","/im/*","/privacy/*","/config/*"}, filterName = "apiFilter") public class SecurityRequestFilter implements Filter { } 以上代碼,urlPatterns 沒有指名要過濾“/”根路徑,但是在輸入http://localhost:8080/之后,卻能進入filter。 啟動打印日志如下: 觀察日志可以看出,注冊的過濾器除了使用filterName = "apiFilter"顯示注冊的外,還隱試注冊了一個以類名首字母為小寫的過濾器(securityRequestFilter ) 解決方法:將 filterName = "apiFilter" 修改為 filterName = "securityRequestFilter",覆蓋掉隱試注冊的過濾器,這樣就可以避免注冊多個過濾器。從而解決輸入任何路徑都能進過濾器的問題。
__________________________________________________________________________
https://www.jianshu.com/p/05c8be17c80a
前言
以往的javaEE增加Filter是在web.xml中配置,然而spring-boot中很明顯不能這樣實現,那怎么辦呢?看完下面的教程,答案自然知道了。
前言
傳統的javaEE增加Filter是在web.xml中配置,如以下代碼:
<filter> <filter-name>TestFilter</filter-name> <filter-class>com.cppba.filter.TestFilter</filter-class> </filter> <filter-mapping> <filter-name>TestFilter</filter-name> <url-pattern>/*</url-pattern> <init-param> <param-name>paramName</param-name> <param-value>paramValue</param-value> </init-param> </filter-mapping>
然而spring-boot中很明顯不能這樣實現,那怎么辦呢?看完下面的教程,答案自然知道了。
老方法(新方法請直接下拉)
1.創建自定義Filter
package com.cppba.filter; import javax.servlet.*; import java.io.IOException; public class TestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("TestFilter"); } @Override public void destroy() { } }
2.在ApplicationConfiguration.java中增加一個@bean
@Bean public FilterRegistrationBean testFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new TestFilter()); registration.addUrlPatterns("/*"); registration.addInitParameter("paramName", "paramValue"); registration.setName("testFilter"); registration.setOrder(1); return registration; }
3.啟動項目
你會看到控制台打印如下代碼:

4.訪問項目
最后我們訪問以下http://127.0.0.1:8080/test
如果你看到控制台打印出:TestFilter

恭喜你,配置成功!
2017-04-20 最新spring-boot增加Filter方法
首先定義一個Filter
@Order(1) //重點 @WebFilter(filterName = "testFilter1", urlPatterns = "/*") public class TestFilterFirst implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("TestFilter1"); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }
比較核心的代碼是自定義類上面加上@WebFilter,其中@Order注解表示執行過濾順序,值越小,越先執行
我們在spring-boot的入口處加上如下注解@ServletComponentScan:
@SpringBootApplication(scanBasePackages = "com.cppba") //重點 @ServletComponentScan public class Application { public static void main(String[] args) throws UnknownHostException { SpringApplication app = new SpringApplication(Application.class); Environment environment = app.run(args).getEnvironment(); } }
這種方法效果和上面版本一樣,但是用起來更加方便!
____________________________________________________________________________________
Web 過濾器參數設置問題
Posted on 2017-09-06 22:00 耍流氓的兔兔 閱讀(197) 評論(0) 編輯 收藏問題描述:
在代碼定義了3個過濾器,分別為filter1,filter2,filter3,過濾的Servlet范圍分別是"/*","/Servlet1","/Servlet1",只在filter3種配置了初始化參數 預設結果為:
filter1...進...
filter2...進...
filter3...進...
com.roxy_filter.Filter3
hello
filter3...出...
filter2...出...
filter1...出...
運行結果卻是:
filter1...進...
filter2...進...
filter2...出...
filter1...出...
問題代碼:
@WebFilter(filterName="filter3", servletNames="/Servlet1", initParams={ @WebInitParam(name="ok", value="hello") } )
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("filter3...進...");
System.out.println(Thread.currentThread().getStackTrace()[1].getClassName());
String v = fConfig.getInitParameter("ok");
System.out.println(v);
chain.doFilter(request, response);
System.out.println("filter3...出...");
}
問題分析:
首先將filter3的@WebFilter聲明改為和filter2一致,輸出正常,說明doFilter()方法沒有問題
仔細查看文檔,發現有兩個參數:
servletNames String[]:指定過濾器將應用於哪些 Servlet。取值是 @WebServlet 中的 name 屬性的取值,或者是 web.xml 中 <servlet-name> 的取值
urlPatterns :指定要過濾的URL模式,也可使用屬性value來聲明.(指定要過濾的URL模式是必選屬性)
所以將servletNames="/Servlet1"改為urlPatterns ="/Servlet1",表明只對Servlet1進行過濾,運行,結果正確
問題解決:
@WebFilter(filterName="filter3", urlPattens="/Servlet1", initParams={ @WebInitParam(name="ok", value="hello") } )
問題總結:
web3.0 之后,對於servlet,filter,listener有兩種配置方式,一種是在web.xml種進行傳統的配置,另一種是直接在類種進行注解式聲明
@WebFilter 用於將一個類聲明為過濾器,該注解將會在部署時被容器處理,容器將根據具體的屬性配置將相應的類部署為過濾器。該注解具有下表給出的一些常用屬性 ( 以下所有屬性均為可選屬性,但是 value、urlPatterns、servletNames 三者必需至少包含一個,且 value 和 urlPatterns 不能共存,如果同時指定,通常忽略 value 的取值 )
屬性名 | 類型 | 描述 |
filterName | String | 指定過濾器的 name 屬性,等價於 <filter-name> |
value | String[] | 該屬性等價於 urlPatterns 屬性。但是兩者不應該同時使用 |
urlPatterns | String[] | 指定一組過濾器的 URL 匹配模式。等價於 <url-pattern> 標簽 |
servletNames | String[] | 指定過濾器將應用於哪些 Servlet。取值是 @WebServlet 中的 name 屬性的取值,或者是 web.xml 中 <servlet-name> 的取值 |
dispatcherTypes | DispatcherType | 指定過濾器的轉發模式。具體取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST |
initParams | WebInitParam[] | 指定一組過濾器初始化參數,等價於 <init-param> 標簽 |
asyncSupported | boolean | 聲明過濾器是否支持異步操作模式,等價於 <async-supported> 標簽 |
description | String | 該過濾器的描述信息,等價於 <description> 標簽 |
displayName | String | 過濾器的顯示名,通常配合工具使用,等價於 <display-name> 標簽 |