Servlet过滤器URL映射

8
如何将过滤器映射到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,可以成功调用过滤器,但我不确定如何让根目录的请求也调用该过滤器。根据Servlet规范(3.0版本)

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

空字符串映射到根目录,而默认servlet映射到默认servlet。以下是规范中相关的部分:

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

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

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

我希望有人能够解释一下这个问题。谢谢。
安德鲁
1个回答

8
<url-pattern>/</url-pattern> 应该适用于根目录的请求。你试过了吗?
如果您的意图是过滤所有请求,那么应该使用 <url-pattern>/*</url-pattern>
更新: 为了排除其中一个,我测试了Tomcat 7上的url-pattern(使用web.xml@WebFilter(urlPatterns={"/"})),它确实没有按预期工作。然而,在Tomcat 6(Servlet 2.5)和Glassfish v3(Servlet 3.0)上,/url-pattern可以正常工作。我怀疑Tomcat 7存在一个bug,因此我已经报告了问题49914

@Balus - 我现在遇到了完全相同的问题 - 我正在使用Tomcat7,并希望将所有请求URL为空(www.mysite.com)的调用转发到servlet。但是,如果URI不为空,则不应将其指向servlet。我正在使用tomcat 7.9.16 - 应该如何处理? - Dejell
@Odelya:在“/*”上映射一个过滤器,并自己确定“HttpServletRequest#getRequestURI()”。如果URI为空,则通过“RequestDispatcher#forward()”调度到“/”,否则只需继续过滤器链。 - BalusC
@Balus - 我的过滤器会对性能产生什么影响? - Dejell
1
@Odelya:那个额外的if-else检查?完全可以忽略不计。 - BalusC
1
@BalusC <<<url-pattern>/</url-pattern> 应该适用于根目录的请求。>> 对于 Tomcat 6(Servlet 2.5)来说并不是这样。关于此主题有任何更新吗? - Joseph Victor Zammit
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接