Web应用上下文为/时,根路径请求被*.do过滤器拦截的原因排查
根据你描述的情况,按道理*.do的URL模式应该只会拦截以.do结尾的请求,但根路径http://localhost:8080/被拦截确实不符合预期,下面是几个最可能的原因和排查方向:
过滤器内部逻辑偏离了配置的URL规则
很多时候问题出在过滤器的代码实现上,而不是XML配置。比如你的AuthorizationFilter里可能写了额外的判断逻辑:比如检查请求路径是否为根路径"/",然后直接执行拦截逻辑,完全忽略了配置的*.do匹配规则。你可以检查过滤器的doFilter方法,看有没有类似这样的代码:String uri = request.getRequestURI(); if (uri.equals("/")) { // 执行拦截操作 chain.doFilter(request, response); // 或者直接返回拦截结果 }如果有这种硬编码的判断,不管XML配置的是什么,根路径请求都会被拦截。
存在额外的
filter-mapping配置
你只贴了部分配置,有没有可能在XML里还有其他针对authorizationFilter的<filter-mapping>条目?比如:<filter-mapping> <filter-name>authorizationFilter</filter-name> <url-pattern>/</url-pattern> </filter-mapping>或者配置了
<dispatcher>标签,比如包含了FORWARD、INCLUDE等类型:<filter-mapping> <filter-name>authorizationFilter</filter-name> <url-pattern>*.do</url-pattern> <dispatcher>FORWARD</dispatcher> </filter-mapping>如果根路径的请求内部转发到了某个
.do路径,或者被包含了,那过滤器也会触发拦截。过滤器类上使用了注解配置冲突
如果你在AuthorizationFilter类上添加了@WebFilter注解,比如:@WebFilter(urlPatterns = "/") public class AuthorizationFilter implements Filter { // ... }那么XML配置和注解配置会同时生效,这时候根路径请求就会被注解里的规则匹配到,导致被拦截。很多时候开发者会同时用两种配置方式,自己却没注意到。
容器的特殊URL匹配行为(可能性较低)
极少数情况下,Web容器(比如Tomcat)的URL匹配规则可能有特殊处理,但这种情况非常罕见。你可以先排查前面几个常见原因,如果都排除了,再去检查容器的文档,看是否有根路径匹配的特殊逻辑。
内容的提问来源于stack exchange,提问作者Exprass L

