所有请求的 Servlet 过滤器

Posted

技术标签:

【中文标题】所有请求的 Servlet 过滤器【英文标题】:Servlet Filter for all requests 【发布时间】:2011-12-18 11:48:59 【问题描述】:

我想知道,如何在 web.xml 中设置一个在每个请求上调用的过滤器?

【问题讨论】:

【参考方案1】:

使用“*”通配符添加过滤器映射。

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

【讨论】:

过滤器没有被调用,例如mysite.com?blahblah,当查询字符串不是绑定到一个servlet而是绑定到根url时。你知道解决办法吗? 我有一个完全相同的问题,我的过滤器不会为来自客户端的每个请求调用。我需要一个过滤器来捕获所有请求,无论它们是在应用程序级别还是 jboss 容器级别... 能否通过servlet过滤器捕获Tomcat中的所有请求(webapp & non-webapp contextx)? @M.S.Naidu 你找到解决方案了吗?我知道这是一个旧线程,但我面临同样的问题。有什么帮助吗?【参考方案2】:

只需创建一个过滤器,并将其映射到 /*

例如

    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.mycompany.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

【讨论】:

过滤器没有被调用,例如mysite.com?blahblah,当查询字符串不是绑定到servlet而是绑定到根url时。你知道解决办法吗? 它应该被调用。您能否检查一下与 mysite.com 关联的 servlet 是如何映射的?如果 mysite.com 是直接从 Web 服务器呈现的静态页面,则可能是 Java 应用程序永远不会对该 URL 进行访问。 如果是这样,那么我如何将过滤器绑定到根 url? 如果根 url 不是通过 java 应用程序提供的,很遗憾你不能附加过滤器:-)。如果您需要提供过滤器,您可以使用重定向规则模仿网络服务器上的行为,或者获取 java 应用程序提供的根 url。【参考方案3】:

您确定请求正在访问控制器/servlet?如果它正在进行 Ajax 调用或运行一些 JS,则过滤器不会命中。

【讨论】:

【参考方案4】:

Spring Security Web 将所有 url 定义为 /**。所以它应该适用于所有请求。

见- org.springframework.security.web.util.matcher.AntPathRequestMatcher

它将MATCH_ALL 常量定义为/**,并且这个最终变量用于matches 方法。

粘贴在来自org.springframework.security.web.util.matcher.AntPathRequestMatcher 的方法定义下方,它决定某些请求 url 是否匹配。如果模式设置为MATCH_ALL aka /**,则返回true

public boolean matches(HttpServletRequest request) 
        if (this.httpMethod != null && StringUtils.hasText(request.getMethod())
                && this.httpMethod != valueOf(request.getMethod())) 
            if (logger.isDebugEnabled()) 
                logger.debug("Request '" + request.getMethod() + " "
                        + getRequestPath(request) + "'" + " doesn't match '"
                        + this.httpMethod + " " + this.pattern + "'");
            

            return false;
        

        if (this.pattern.equals(MATCH_ALL)) 
            if (logger.isDebugEnabled()) 
                logger.debug("Request '" + getRequestPath(request)
                        + "' matched by universal pattern '/**'");
            

            return true;
        

        String url = getRequestPath(request);

        if (logger.isDebugEnabled()) 
            logger.debug("Checking match of request : '" + url + "'; against '"
                    + this.pattern + "'");
        

        return this.matcher.matches(url);
    

【讨论】:

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

Servlet 过滤器

使 servlet 过滤器适用于所有 Web 应用程序

过滤器

必须在Servlet上启用异步支持,并为异步请求处理中涉及的所有过滤器启用

Servlet过滤器

[JavaWeb] Servlet Filter