所有请求的Servlet过滤器

18
我想知道如何在web.xml中设置一个Filter,以便在每个请求时都调用它?
4个回答

21
只需创建一个过滤器,并将其映射到 /*。
例如。
    <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>

1
过滤器没有在 http://mysite.com?blahblah 这样的示例中被调用,当查询字符串不是绑定到 servlet 而是根 URL 时。你知道有什么解决方法吗? - fernandohur
它应该被调用。您能否检查一下您的servlet与mysite.com相关联的映射方式?如果mysite.com是直接从Web服务器呈现的静态页面,则Java应用程序可能永远不会为该URL获得命中。 - aishwarya
如果是这样的话,我该如何将过滤器与根URL绑定? - fernandohur
如果根URL未通过Java应用程序提供,则不幸的是您无法附加过滤器 :-)。 如果您需要服务过滤器,则可以使用重定向规则在Web服务器上模拟行为,或者也可以让Java应用程序同时提供根URL。 - aishwarya

1

添加一个带有 '*' 通配符的过滤器映射。

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

当查询字符串绑定到根URL而不是servlet时,筛选器没有被调用。您知道有解决办法吗? - fernandohur
我有一个完全相同的问题,我的过滤器没有为客户端的每个请求调用。我需要一个过滤器来捕获所有请求,无论它们是在应用程序级别还是jboss容器级别... - Kostadin Georgiev
我们能否通过Servlet过滤器捕获Tomcat中的所有请求(Web应用程序和非Web应用程序上下文)? - M.S.Naidu
@M.S.Naidu,你找到解决方案了吗?我知道这是一个旧的线程,但我正在面临同样的问题。有什么帮助吗? - user

0

Spring Security Web 将所有的url定义为 /**。因此,它适用于所有请求。

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

它将MATCH_ALL常量定义为/**,并且该最终变量在matches方法中使用。

以下是从org.springframework.security.web.util.matcher.AntPathRequestMatcher中粘贴的方法定义,其中它决定某些请求URL是否匹配。如果将模式设置为MATCH_ALL,即/**,则返回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);
    }

-2

你确定请求是否到达了控制器/Servlet?如果它是进行Ajax调用或运行一些JS的话,那么过滤器将不会被触发。


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