所有请求的 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 过滤器的主要内容,如果未能解决你的问题,请参考以下文章