【发布时间】:2016-04-30 15:53:14
【问题描述】:
我正在开发一个使用 Servlet 过滤器执行一些验证的 REST 应用程序。
该应用程序由 6 个部署的服务组成,这些服务部署为 war 文件。该应用程序部署在 Apache TomEE 网络服务器 (1.7.3) 中。该应用程序使用 JAX-RS API 2.0。
每个 web 应用中的端点 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(s) 中的 web.xml 文件中配置它。这将使部署更容易,因为部署应用程序的人不必更改 TomEE 中的 web.xml。
我计划在每个战争中添加一个 web.xml,在路径上
<module name>/src/main/webapp/WEB-INF
但我不确定在已部署战争中配置的过滤器的行为方式。如果我添加一个 url-pattern 为“/*”的过滤器,该过滤器将只捕获该服务的请求还是所有已部署战争的所有请求?
【问题讨论】:
-
您使用的是哪个版本的 TomEE?请编辑 OP 并添加此信息。
-
如果后者是真的,那将是一个巨大的安全漏洞。
-
@BalusC 你能否再解释一下你的评论,谢谢!
-
想象一台服务器为来自独立用户的各种 Web 应用程序提供服务(例如共享主机)。如果一个 webapp 的过滤器可以连接到其他 webapp 的请求,那么它就可以读取和操作其他 webapp 中的所有内容。这当然是不允许的。
-
“我在 web.xml(位于 APACHE_TOMEE/conf/web.xml 的文件)中按如下方式配置了 servlet 过滤器”——这是非标准的,仅适用于使用 Tomcat 作为他们的 Web 容器(TomEE 显然是这样做的)。在每场战争中放置过滤器信息是您想要的方式。恕我直言,应该有一种标准方法来指定全局过滤器,但现在是 2019 年,仍然没有。
标签: rest web.xml servlet-filters apache-tomee