【问题标题】:How do I allow a servlet filter in the root context to work on other contexts?如何允许根上下文中的 servlet 过滤器在其他上下文中工作?
【发布时间】:2017-03-10 14:57:21
【问题描述】:

我有一个 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>

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

【问题讨论】:

    标签: java tomcat servlets jakarta-ee servlet-filters


    【解决方案1】:

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

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

    【讨论】:

    猜你喜欢
    • 2012-02-02
    • 2011-12-07
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2010-12-21
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多