【发布时间】:2011-12-18 11:48:59
【问题描述】:
我想知道,如何在 web.xml 中设置一个在每个请求上调用的过滤器?
【问题讨论】:
标签: java servlets servlet-filters
我想知道,如何在 web.xml 中设置一个在每个请求上调用的过滤器?
【问题讨论】:
标签: java servlets servlet-filters
使用“*”通配符添加过滤器映射。
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
【讨论】:
只需创建一个过滤器,并将其映射到 /*
例如
<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>
【讨论】:
您确定请求正在访问控制器/servlet?如果它正在进行 Ajax 调用或运行一些 JS,则过滤器不会命中。
【讨论】:
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);
}
【讨论】: