之前我們控制多個filter的執行順序是通過web.xml中控制filter的位置來控制的,放在上面的會比放在下面的先執行,如下“使用者登入檢查過濾器”會比“接口日志過濾器”先執行。
<!-- 使用者登入檢測過濾器 -->
<filter>
<filter-name>UserLoginFilter</filter-name>
<filter-class>net.tfgzs.demo.filter.UserLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--接口日志過濾器-->
<filter>
<filter-name>ApiLog</filter-name>
<filter-class>net.tfgzs.demo.filter.ApiLog</filter-class>
</filter>
<filter-mapping>
<filter-name>ApiLog</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但是當我們使用@WebFilter注解的時候發現注解裡面沒有提供可以控制執行順序的參數
@WebFilter 的屬性
屬性名 | 類型 | 描述 |
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> 标簽。 |
通過實踐發現如果想要控制filer的執行順序可以通過控制filter的檔案名來控制
比如:
UserLoginFilter.java 和 ApiLog.java 這兩個檔案裡面分别是“使用者登入檢查過濾器”和“接口日志過濾器”,因為這兩個檔案的首字母A排U之前,導緻每次執行的時候都是先執行“接口日志過濾器”再執行“使用者登入檢查過濾器”,是以我們現在修改兩個檔案的名稱分别為
Filter0_UserLogin.java
Filter1_ApiLog.java
這樣就能先執行“使用者登入檢查過濾器”再執行“接口日志過濾器”