根据我的理解,过滤器执行的顺序是它们在web.xml中为相同的url-mapping定义的顺序。但是,如果我们在容器的web.xml和单个应用程序的web.xml中为相同的url映射定义了多个过滤器,我找不到任何引用的行为
我的假设是,由于应用程序被部署为容器的一部分,比如tomcat,它有自己的web.xml,针对每个这样部署的应用程序的任何请求都必须通过tomcat中定义的过滤器链。在通过应用程序筛选器之前/conf/web.xml。但我的理解是错误的
我有一个简单的Web应用程序,在web.xml中定义了两个过滤器,如下所示
<filter>
<filter-name>AppFilterOne</filter-name>
<filter-class>com.test.filters.AppFilterOne</filter-class>
</filter>
<filter>
<filter-name>AppFilterTwo</filter-name>
<filter-class>com.test.filters.AppFilterTwo</filter-class>
</filter>
<filter-mapping>
<filter-name>AppFilterOne</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AppFilterTwo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果我没有任何进一步的更改,如果我点击了我的网址http://localhost:8080/myapp,我会看到AppFilterOne和AppFilterTwo按此顺序被点击。
现在,我在tomcat / conf / web.xml中添加了两个过滤器(我的tomcat版本是7.0.27,支持servlet 3.0)
<filter>
<filter-name>TomWebFilterOne</filter-name>
<filter-class>com.test.filter.TomWebFilterOne</filter-class>
</filter>
<filter>
<filter-name>TomWebFilterTwo</filter-name>
<filter-class>com.test.filter.TomWebFilterTwo</filter-class>
</filter>
<filter-mapping>
<filter-name>TomWebFilterOne</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>TomWebFilterTwo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
现在,如果我访问http://localhost:8080/myapp,则按以下顺序执行过滤器 AppFilterOne AppFilterTwo TomWebFilterOne TomWebFilterTwo
我最初的假设是,TomWebFilters将首先拦截,然后是特定于应用程序的过滤器。
如果我看到的结果实际上是正确的,那么过滤器是如何工作的,有没有办法可以影响过滤器的执行顺序。我听说但不确定,如果这是正确的方法。
我的实际问题有点背景: 我们在tomcat 7X实例中的不同虚拟机中部署了大量Web应用程序。这些Web应用程序中的每一个都有一个审计过滤器,用于审计和记录每个传入的请求但是,在tomcat /conf/web.xml中,定义了一个过滤器以支持NTLM身份验证(JCIFS风格)。由于此设置,每次进入的请求都会实际记录(作为审计过滤器的一部分),然后针对NTLM进行过滤。我们希望NTLM首先发生,然后发生其他任何事情。
我在想这里有几种方法 A)我们可能需要将该过滤器定义为每个应用程序中的第一个过滤器,而不是在tomcat / conf / web.xml中定义。 B)让NTLM过滤器在请求中设置一个属性,说明NTLM进程的状态,我们的审计过滤器将检查这两次(即两个401 HTTP状态代码),然后返回。
我对这两种方法都不是特别满意,因此想知道可以做些什么
由于
答案 0 :(得分:0)
为了解决我执行审计日志的原始问题,而不是在应用程序web.xml中使用过滤器,我使用AOP来实现此目的。它似乎工作正常。但我仍然很想知道,如果有一种标准的方法来影响WEB-INF / web.xml和conf / web.xml之间声明的过滤器序列