java過濾器(過濾器排序)
定義過濾器順序是很簡單的:匹配請求的過濾器將按照它們出現在部署描述符或者編程式配置中的順序添加到過濾器鏈中(記住,如果同時再部署描述符或者編程式配置中設置了一些過濾器,那么需要在編程式配置中使用addMapping*方法的第二個參數,決定編程式映射是否應該出現在XML映射之前)。不同的請求將匹配不同的過濾器,但使用的過濾器順序總是相同的。不過這個順序並不是那么簡單:URL映射的過濾器優先級比Servlet名稱映射到的過濾器高。如果兩個過濾器都可以匹配某個請求,一個是URL模式而另一個是Servlet名稱,那么在過濾器中,由URL模式匹配的過濾器(即使它的映射出現在后面)總是出現由Servlet名稱匹配的過濾器之前。
有這么一段配置:
<servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/foo*</url-pattern> </servlet-mapping> <filter-mapping> <filter-name>servletFilter</filter-name> <url-pattern>myServlet</url-pattern> </filter-mapping> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/foo*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>anotherFilter</filter-name> <url-pattern>/foo/bar</url-pattern> </filter-mapping>
如果一個普通的請求訪問的URL是/foo/bar,那么它將匹配所有這3個過濾器。過濾器鏈將由3個過濾器組成,依次為myFilter、anotherFilter,然后是servletFilter。myFilter將在anotherFilter之前執行,因為這是它們出現在部署描述符中的順序。它們都將在servletFilter之前執行,因為URL映射總是在Servlet名稱映射之前執行。