SptingBoot過濾器Filter的使用詳解
Filter
Filter屬于Servlet規(guī)范,并不是Spring獨有的。Filter主要用于攔截請求,做一些業(yè)務邏輯操作,然后可以決定請求是否可以繼續(xù)往下分發(fā),落到其他的Filter或者對應的Servlet。
Filter的工作流程
- 進入filter,執(zhí)行相關業(yè)務邏輯
- 若判定失敗,直接返回,不需要將請求發(fā)給Servlet
- 若判定通行,進行入下一個filter
- 如果全部filter通行,進入Servlet邏輯,Servlet執(zhí)行完畢之后,又返回Filter,最后在返回給請求方
自定義Filter的使用方式
Spring中過濾器Filter不同使用方式都是通過:FilterRegistrationBean包裝filter,最終注冊到Servlet容器中。
1. @WebFilter+@ServletComponentScan
在SpringBootApplication上添加@ServletComponentScan注解,在Filter上添加@WebFilter注解。
該方式的缺點:無法設置過濾器之間的優(yōu)先級。
@WebFilter+@ServletComponentScan方式無法通過@Order注解指定過濾器優(yōu)先級:優(yōu)先級使用默認值Ordered.LOWEST_PRECEDENCE(2147483647),相同優(yōu)先級的情況下,根據(jù)名字先后順序來決定。
使用方法
1. 在SpringBootApplication上使用@ServletComponentScan注解
@ServletComponentScan @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); } }
2.在Filter上使用@WebFilter注解
@WebFilter(urlPatterns = {"/test3"}) public class MyFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { System.out.println("======= MyFilter ======="); filterChain.doFilter(request,response); } }
@WebFilter
@WebFilter用于將一個類聲明為過濾器。
WebFilter注解的主要屬性:
屬性名 | 類型 | 描述 |
filterName | String | 指定過濾器的name屬性,(springbean也是用該名稱),等價于< filter-name> |
urlPatterns | String[] | 指定一組過濾器的URL匹配模式。等價于< url-pattern> |
value | String[] | 該屬性等價于urlPatterns屬性,但是兩個不應該同時使用 |
sevletNames | String[] | 指定過濾器將用于哪些servlet。取值是@WebServlet中的name屬性的取值,或者是web.xml中< servlet-name> |
dispatcherTypes | DispatcherType[] | 指定一組過濾器的轉發(fā)模式。具體取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST,默認REQUEST |
initParams | WebInitParam[] | 指定一組過濾器初始化參數(shù),等價于< init-param> |
asyncSupported | boolean | 聲明過濾器是否支持異步操作模式,等價于< async-supported>標簽 |
description | String | 過濾器的描述信息,等價于< description> |
displayName | String | 過濾器的顯示名,通常配合工具使用,等價于< display-name> |
在SpringBoot項目中,@WebServlet、@WebFilter、@WebListener這三個注解默認是不會被掃描的,一般在SpringBootApplication上添加@ServletComponentScan注解,表示對這三個注解的掃描。
@ServletComponentScan可以實現(xiàn)將Servlet(控制器)、Filter(過濾器)、Listener(監(jiān)聽器)自動注冊到Spring容器中,無需其他代碼。
- Servlet:通過@WebServlet注解定義
- Filter:通過@WebFilter注解定義
- Listener:通過@WebListener注解定義
常見問題分析
1. 只使用@WebFilte:過濾器不生效
WebFilter屬于注解屬于Servlet3+,與Spring本身沒有什么關系,所以Spring默認是不認識這個注解的。
2. @WebFilter+@Component:配置的過濾條件不生效 同上,Spring是不認識@WebFilter注解的,所以注解配置的任何屬性都無意義(例如:指定過濾的url)。 該種方式其實就等同于只加了個@Component注解,此時過濾器能生效,但無過濾條件,會過濾所有url。
3. @WebFilter+@Component+@ServletComponentScan:過濾器會被調用兩次
- 一次:@WebFilter+@ServletComponentScan,被SpringBean管理,過濾器生效,根據(jù)@WebFilter配置的屬性過濾
- 二次:@Component,又被SpringBean管理一次,過濾器生效(和上面不是同一個bean),過濾全部url
4. @WebFilter+@Order+@ServletComponentScan:設置過濾器優(yōu)先級無效
通過@WebFilter+@ServletComponentScan方式注冊的,其生成的FilterRegistrationBean并沒有檢查@Order注解,所以@Order注解不生效。
2. @Component+@Order
通過在Filter上加@Component和@Order注解,即可被Spring管理,并可指定過濾器的執(zhí)行順序。
該方式的缺點:只能過濾所有URL,不能通過配置去過濾指定的 URL。
使用方法
@Order(100) @Component public class MyFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { System.out.println("======= MyFilter ======="); filterChain.doFilter(request,response); } }
3. FilterRegistrationBean(推薦)
直接通過配置類定義Filter的FilterRegistrationBean,交給SpringBean容器管理。
該方式既能通過配置去過濾指定的 URL,也能指定過濾器之間的優(yōu)先級。
使用方法
public class MyFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { System.out.println("======= MyFilter ======="); filterChain.doFilter(request,response); } }
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean<MyFilter> filterRegistrationBean() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(myFilter()); registration.setName("myFilter"); registration.addUrlPatterns("/test3"); registration.setOrder(100); return registration; } @Bean public MyFilter myFilter() { return new MyFilter(); } }
到此這篇關于SptingBoot過濾器Filter的使用詳解的文章就介紹到這了,更多相關SptingBoot過濾器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring實現(xiàn)動態(tài)切換、添加數(shù)據(jù)源及源碼分析
這篇文章主要給大家介紹了關于spring實現(xiàn)動態(tài)切換、添加數(shù)據(jù)源及源碼分析的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-09-09MybatisPlus中插入數(shù)據(jù)后獲取該對象主鍵值的實現(xiàn)
這篇文章主要介紹了MybatisPlus中插入數(shù)據(jù)后獲取該對象主鍵值,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09詳解spring cloud config實現(xiàn)datasource的熱部署
這篇文章主要介紹了詳解spring cloud config實現(xiàn)datasource的熱部署,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01spring security的BCryptPasswordEncoder加密和對密碼驗證的原理分析
文章介紹了加密算法和hash算法的基本概念,以及BCryptPasswordEncoder加密和解密的原理,加密算法是可逆的,需要加鹽以保證安全性,BCryptPasswordEncoder通過生成鹽值并在加密和解密過程中使用,確保相同的明文每次加密結果不同,從而提高安全性2024-11-11