实现WebMvcConfigurer时excludePathPatterns不生效的问题

最近使用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方法,目前还不知道哪里可以配置
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值