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的请求,这个就是很多样的原因了,这里就不罗嗦了
|