在部署战争中配置的“捕获所有”servlet过滤器是否捕获所有请求,或仅捕获该战争中包含的应用程序?

时间:2016-01-24 09:08:03

标签: rest web.xml servlet-filters tomee

我正在使用一个使用Servlet过滤器执行某些验证的REST应用程序。

该应用程序由6个已部署的服务组成,这些服务部署为war文件。该应用程序部署在Apache TomEE Web服务器(1.7.3)中。该应用程序使用JAX-RS API 2.0。

每个webapps中端点的URL遵循相同的模式。

他们都遵循这种模式:

/<2 letter application identifier>-ws-rest/<endpoint name part>/<endpoint name part>

例如:

/cd-ws-rest/install/data
/af-ws-rest/retrieve/user/information

我在web.xml(位于APACHE_TOMEE/conf/web.xml的文件)中配置了如下servlet过滤器:

<filter>
    <filter-name>LoggingFilter</filter-name>
    <filter-class>com.company.LoggingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LoggingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

此过滤器捕获所有请求(无论请求所针对的部署战争)。换句话说,此过滤器会捕获对所有端点的请求(无论端点存在哪些战争)。

我想更改应用程序,以便不是在TomEE web.xml中配置过滤器,而是在一个打包在war中的web.xml文件中配置它。这将使部署更容易,因为部署应用程序的人员不必更改TomEE中的web.xml。

我打算在路径

的每个战争中添加一个web.xml
<module name>/src/main/webapp/WEB-INF

但我不确定在部署的战争中配置的过滤器是如何运作的。如果我添加了一个url-pattern为“/ *”的过滤器,那么该过滤器是否只捕获该服务的请求或所有已部署战争的所有请求?

1 个答案:

答案 0 :(得分:2)

斜线星型映射将使过滤器适用于仅定义过滤器的Web应用程序的所有请求。

根据servlet 3.0规范6.2.1节:

  

每个&lt; filter&gt;只有一个实例部署描述符中的声明是   根据容器的JVM实例化。容器提供过滤器部署描述符中声明的过滤器配置,Web应用程序的ServletContext引用以及初始化参数集。

第6.2.4节:

  

使用&lt; urlpattern&gt;可以将过滤器与servlet组和静态内容相关联。   过滤映射的样式:   此处,Logging Filter适用于Web应用程序中的所有servlet和静态内容页面,因为每个请求URI都与'/ *'URL模式匹配。

可能存在特定于服务器的解决方案,可能允许将过滤器应用于对所有应用程序发出的所有请求,但默认的servlet规范定义的行为是将过滤器应用于定义它的应用程序中的请求。