实现WebMvcConfigurer时excludePathPatterns不生效的问题

本文探讨了Spring MVC中使用WebMvcConfigurer添加自定义拦截器时出现的问题,即excludePathPatterns配置无效导致的无限重定向循环,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近使用WebMvcConfigurer做请求拦截时,自定义HandlerInterceptor处理用户身份。

但使用WebMvcConfigurer的addInterceptors添加自定义拦截器出现问题,excludePathPatterns一直不生效,导致浏览器无限被拦截器重定向到login,然后继续被拦截。。。重定向。。。拦截。。。

网上大部分是说由于后端重定向到error页面,确实有这种情况,打印拦截器请求的uri就可以发现。

但我不是,由于我配置了context-path,也就是说我的完整请求是{context-path}/**/**这种形式,而且excludePathPatterns也是写的这个完整uri,但是!拦截器的匹配规则是不包含{context-path}的!

举个例子
你配置了{context-path}为"admin";

你使用WebMvcConfigurer的addInterceptors自定义拦截器,其中不拦截excludePathPatterns配置为"/admin/login";

但spring实际匹配时,实际是用"/login",直接用这个去匹配excludePathPatterns,很明显匹配不到,ok,那就只好进入interceptor;

解决方式

excludePathPatterns配置时不加{context-path},以上为例,excludePathPatterns应配置为"/login"即可;

 

 

为什么Spring不是用完整URI而阉割了{context-path}去做匹配,时间有限暂时未找到原因

具体可以在源码org.springframework.web.servlet.handler.MappedInterceptor的方法org.springframework.web.servlet.handler.MappedInterceptor#matches(javax.servlet.http.HttpServletRequest)查看匹配逻辑


spring-webmvc源码中,org.springframework.web.servlet.handler.AbstractHandlerMapping#getHandlerExecutionChain方法主要是遍历所有interceptor拦截器,路径如果匹配,就将拦截器添加到执行链HandlerExecutionChain中。

  1. 其中判断路径匹配,实际是调用org.springframework.web.servlet.handler.MappedInterceptor#matches方法,因为拦截器本身配置了include和exclude方法,exclude匹配上就false,include匹配上就true
  2. 那么上述匹配路径,用的路径是从哪获取的?是request.getRequestURI()?根据参数名知道是一个lookupPath的字符串,是调用org.springframework.web.util.UrlPathHelper#getLookupPathForRequest得来的
    public String getLookupPathForRequest(HttpServletRequest request) {
            if (this.alwaysUseFullPath) {
                return this.getPathWithinApplication(request);
            } else {
                String rest = this.getPathWithinServletMapping(request);
                return !"".equals(rest) ? rest : this.getPathWithinApplication(request);
            }
    }

     

  3. 上面getLookupPathForRequest方法底层不过是一堆查找请求路径、查找上下文路径的字符串操作,不看。关键是在于这个alwaysUseFullPath 布尔属性,它隶属于UrlPathHelper类,具有set方法,目前还不知道哪里可以配置
### 关于SaToken拦截器配置不生效的原因分析 当遇到`excludePathPatterns`部分不生效的情况,这通常意味着即使指定了某些路径应被排除在外,这些路径仍然受到拦截器的影响。具体原因可能涉及多个方面。 对于全局注册配置中的`excludePathPatterns`不起作用的问题,在尝试多种解决方案之后发现,问题根源在于Spring框架如何处理预检请求(即OPTIONS请求)。由于此类请求不会携带任何认证信息,因此在到达`SaInterceptor`之前就已经因为缺少必要的身份验证令牌而导致了不必要的拦截行为[^2]。 针对上述情况的一种有效解决策略是在应用层面增加对HTTP OPTIONS方法类型的特殊处理逻辑,确保这类请求能够绕过常规的身份验证流程: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS"); } } ``` 另外一种常见的场景是与API文档工具集成出现问题,比如Knife4j。为了使Swagger UI等相关资源可以正常加载而不受安全机制干扰,应当仔细检查并调整路径模式匹配规则,确保所有静态文件和服务端点都被正确地列入白名单内[^3]。 最后值得注意的是,在使用Spring Cloud Gateway作为网关服务的情况下,还需要额外关注其自身的路由设置是否会对下游微服务的安全性造成影响。特别是当涉及到跨域资源共享(CORS)政策以及代理转发规则的候,可能会间接引起类似的权限控制失效现象[^4]。 通过以上措施应该可以帮助定位并修复SaToken拦截器配置中存在的漏洞或不足之处,从而恢复预期的功能表现。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值