Servlet 过滤器 url 映射

Posted

技术标签:

【中文标题】Servlet 过滤器 url 映射【英文标题】:Servlet filter url mapping 【发布时间】:2011-04-10 19:52:30 【问题描述】:

如何将过滤器映射到 URL 的根?我正在使用 Tomcat 7.0.2 并将应用程序部署为 ROOT.war。欢迎页面是 sign_in.xhtml。每当客户端发送对站点根目录的请求(即仅域名)或客户端请求 sign_in.xhtml 时,我想运行过滤器。这是我目前所拥有的:

  <filter>
        <filter-name>My filter</filter-name>
        <filter-class>com.myApp.myFilter</filter-class>        
    </filter>
    <filter-mapping>
        <filter-name>My filter</filter-name>
        <url-pattern>/sign_in.xhtml</url-pattern>
    </filter-mapping>

直接请求sign_in.xhtml,成功调用过滤器,但我不知道如何获取root 调用过滤器的请求。根据 Servlet 规范(3.0 版)

<url-pattern>/</url-pattern>

映射到默认的servlet,空字符串映射到根。这是规范中的相关部分:

"空字符串 ("") 是一种特殊的 URL 模式,它完全映射到 应用程序的上下文根,即http://host:port// 形式的请求。在这种情况下,路径信息是“/”,servlet 路径和上下文路径是 空字符串(“”)。”

但是,以下两种 url 模式都会导致 Tomcat 抛出异常。

<url-pattern></url-pattern>
<url-pattern>""</url-pattern>

如果有人能对此有所了解,我将不胜感激。谢谢。

安德鲁

【问题讨论】:

【参考方案1】:

&lt;url-pattern&gt;/&lt;/url-pattern&gt; 应该适用于根上的请求。你试过了吗?

如果您的意图更多是过滤所有请求,那么您应该使用&lt;url-pattern&gt;/*&lt;/url-pattern&gt;


更新:为了排除一个和另一个,我在 Tomcat 7 上测试了/url-pattern(同时使用了web.xml@WebFilter(urlPatterns="/")),它确实不能作为预期的。但是,/url-pattern 在 Tomcat 6 (Servlet 2.5) 和 Glassfish v3 (Servlet 3.0) 上可以正常工作。我怀疑 Tomcat 7 中存在错误,因此我已报告issue 49914。

【讨论】:

感谢您查看此 BalusC。如果用户需要更改密码,我打算强制重定向。过滤器似乎是正确的解决方案。我想我将不得不等待 7.0.3 或想出一些不同的东西。有什么想法吗? 一个监听/*的过滤器,只有在请求URI为空时才会采取行动。 我会试一试,然后在 Tomcat 错误修复后更新 url-patten。 @Balus - 我现在有确切的问题 - 我正在使用 Tomcat7 并希望将请求 URL 为空 (www.mysite.com) 的所有调用转发到 servlet。但是如果 URI 不为空 - 它不应该将它定向到 servlet。我正在使用 tomcat 7.9.16 - 我应该怎么做? @Odelya:那额外的if-else 支票?完全可以忽略不计。

以上是关于Servlet 过滤器 url 映射的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.IllegalArgumentException:过滤器映射必须指定 <url-pattern> 或 <servlet-name>

如何在 Jetty 中的 /* 上映射 servlet 过滤器?

将 /xxx/yyy/zzz 动态映射到类 XxxYyyZzz.java 的 servlet 或过滤器

servlet 过滤器重写 URL

奇怪的 Java Servlet 过滤器映射行为

特定 url 的过滤器映射