java Servlet 过滤器 url 映射

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3686420/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 03:00:07  来源:igfitidea点击:

Servlet filter url mapping

javaservletsservlet-filtersurl-pattern

提问by J. Andrew Laughlin

How can a filter be mapped to the root of a URL? I'm using Tomcat 7.0.2 and deploying an application as ROOT.war. The welcome page is sign_in.xhtml. I would like to run a filter whenever the client sends a request for the root of the site (i.e. the domain name only), or when the the client requests sign_in.xhtml. Here is what I have so far:

如何将过滤器映射到 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>

Requests for sign_in.xhtml directly, successfully invoke the filter, but I'm not sure how to get requests for the root to invoke the filter. According to the Servlet spec (version 3.0)

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

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

maps to the default servlet, and an empty string maps to the root. Here's the relevant section from the spec:

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

"The empty string ("") is a special URL pattern that exactly maps to the application's context root, i.e., requests of the form http://host:port//. In this case the path info is '/' and the servlet path and context path is empty string (““)."

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

However, both of the following url patterns cause Tomcat to throw an exception.

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

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

I would really appreciate it if someone could shed some light on this. Thank You.

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

Andrew

安德鲁

采纳答案by BalusC

The <url-pattern>/</url-pattern>should work for requests on the root. Did you try it?

<url-pattern>/</url-pattern>应适用于根的请求。你试了吗?

If your intent is more to filter allrequests, then you should use <url-pattern>/*</url-pattern>.

如果您的意图更多地是过滤所有请求,那么您应该使用<url-pattern>/*</url-pattern>.



Update: To exclude one and other, I tested the url-patternof /at Tomcat 7 (using both web.xmland @WebFilter(urlPatterns={"/"})) and it indeed didn't work as expected. The url-patternof /however works as expected on Tomcat 6 (Servlet 2.5) and also on Glassfish v3 (Servlet 3.0). I suspect a bug in Tomcat 7, so I've reported issue 49914about this.

更新:为了排除一个和另一个,我在 Tomcat 7(同时使用和)测试了url-pattern,它确实没有按预期工作。然而,of在 Tomcat 6 (Servlet 2.5) 和 Glassfish v3 (Servlet 3.0) 上按预期工作。我怀疑 Tomcat 7 中存在错误,因此我已报告了有关此问题的 49914/web.xml@WebFilter(urlPatterns={"/"})url-pattern/