java - 如何允许根上下文中的 servlet 过滤器在其他上下文中工作?

标签 java tomcat servlets jakarta-ee servlet-filters

我有一个 WAR 文件部署到 Tomcat 8 的根上下文 (/),它附加了一个 servlet 过滤器。过滤器检查用户是否登录,如果没有则将他们重定向到登录页面。我还在 /app1/app2 的同一 Tomcat 实例中部署了其他上下文。我希望根上下文中的过滤器也适用于其他上下文,因此我不必维护三个几乎相同的过滤器(每个上下文一个)。

问题是属于其他上下文的任何 URL 都没有被根上下文中的过滤器处理。例如,URI /foo/bar 被过滤器捕获(因为它不对应于其他上下文之一),但是 /app1/foo/bar没有被捕获。

我已经尝试通过修改 web.xml 文件中的过滤器映射来配置过滤器以捕获所有内容:

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

而且我还尝试显式添加每个上下文:

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <url-pattern>/app1/*</url-pattern>
    <url-pattern>/app2/*</url-pattern>
</filter-mapping>

但是这两种方法都不起作用。我认为这是一个安全问题——其他上下文需要明确允许根过滤器。我如何让它发挥作用?

最佳答案

你不能让它工作。 Web 应用程序是独立的。在映射任何过滤器或 Servlet 之前,将请求映射到 Web 应用程序。

使用 Tomcat 的最佳选择(假设您不想要多个过滤器定义)是将您的过滤器重新实现为 Tomcat Valve 并在主机上配置该 Valve。

关于java - 如何允许根上下文中的 servlet 过滤器在其他上下文中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40292830/

相关文章:

java - 为什么java不支持重启线程

java - 返回随机文本字段输入

java - 递归DRY代码,计算月份中的天数,Java

eclipse - 未找到 Oracle 驱动程序

java - Spring pageContext.request.contextPath,Apache 后面的 Tomcat 作为反向代理

ruby-on-rails - Apache Tomcat 和 ruby

java - Servlet 对 Android 设备的响应

java - 使用 aws lambda c# 裁剪图像(使用 Java 解决)

java - doPost 跳过response.sendRedirect()

java - 即使返回404错误,tomcat是否创建线程