总结如下:
1. 自定义的PermissionURLFilter 的 filter-mapping 中必须配置(这个配置是决定性的,如果不配置肯定获取不到):
<dispatcher>REQUEST</dispatcher> 和 <dispatcher>FORWARD</dispatcher>
2. 自定义Filter的 filter-mapping 必须配置在 urlrewrite Filter 的 filter-mapping 之后,如果配置在之前,会多拦截一次不是我们想要的URI,如下:
a. 配置在之前,打印System.out.println( request.getRequestURI +" # "+ request.getAttribute("javax.servlet.forward.request_uri") ); 结果如下(拦截了2次,第一次不是我想要的结果,第2个才是):
/testurlrewrite/user/20_e11a9de23afd9 # null
/testurlrewrite/user/user.jsp # /testurlrewrite/user/20_e11a9de23afd9
b.配置在之后,打印如下(只拦截一次,而且是我想要的结果):
/testurlrewrite/user/user.jsp # /testurlrewrite/user/20_e11a9de23afd9
3. 新的web.xml的配置如下:
<!-- 这里配置的是 urlrewrite的 Filter org.tuckey.web.filters.urlrewrite.UrlRewriteFilter -->
<filter>
<filter-name>URLRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>URLRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置自定义的Filter -->
<filter>
<filter-name>PermissionFilter</filter-name>
<filter-class>com.my.filters.PermissionURLFilter</filter-class>
</filter>
<!-- 自定义的 filter-mapping 要在 URLRewrite 的filter-mapping 之后 -->
<filter-mapping>
<filter-name>PermissionFilter</filter-name>
<url-pattern>/*</url-pattern>
<!-- ***** 下面必须要配置 ***** -->
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>