preHandle执行两次事发原因,权限放行失败

preHandle执行两次事发原因

事发背景
  • 肯定是只调用了一次接口但是preHandle执行两次,这是有这个问题的前提
  • 创建demo接口的时候(实验新的检验规则),用post测试,此时接口上已经加上了@PassToken去掉鉴权(为了方便测试)。当用postman进行调用的时候,发现报权限错误,此时问题来了,不是已经有@PassToken放行了吗,怎么还会验证权限?
排查问题
  • 首先恢复案发现场,还原执行两次的那个过程
  • 查看两次拦截请求preHandle的不一样的地方,如果你够细心,基本能大致发现问题,发现第二次请求request.getServletPath()获取的方法非请求方法,而是“/error”。这method肯定不是我们需要的,那么此时就可以debug去找这个method出来的原因了。
  • 这里我就不还原debug的过程了,简单说一下method中“/error”出现的原因。

原因

  • 拦截器中preHandle第一次被执行,请求method正确,@PassToken生效,第一次拦截被放过,此时去找能够处理自己的处理器,但是没有找到,于是发出了一个error的请求(error请求的配置类是ErrorMvcAutoConfiguration,具体执行在BasicErrorController中,返回了一个404页面),这个请求被拦截器拦截了,所以输出了拦截语句但是请求路径是error,而不是浏览器发出的初始请求method。

解决办法

  • 首先肯定是第二次输出的下method中“/error”是不需要走preHandle的,可以先在进入preHandle方法去过滤一下,或者放行excludePathPatterns("/error");
  • 查找一下代码接口方法中是否有什么问题导致发出了一个error的请求,这个就是很多样的原因了,这里就不罗嗦了
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值