最近碰到了一个关于过滤器的奇怪的问题。
问题描述
项目中定义了若干过滤器,其中一个是解析header参数,并做相应处理。另一个过滤器覆写了getHeader方法,判断参数值中是否有非法字符,如果有则抛出异常。这两个过滤器均通过WebFilter + ServletComponetScan注解方式来声明的。
在写本文之前,我认为WebFilter方式声明的过滤器是按照类名的字母表顺序来执行的,本地执行结果和网上的很多资料都显示是这样。
而这两个过滤器类名按照字母表顺序,覆写getHeader方法的过滤器执行在前,解析header参数的过滤器执行在后,这样当解析header参数调用request.getHeader方法时,就会执行覆写的方法了。
实际上本地执行结果也符合这一认知,但是在k8s集群中执行时问题就来了,从返回结果看并没有进入到覆写方法中,开启远程调试也显示没有进入到覆写方法过滤器中,在过滤器中加上日志后又一切正常。这个bug好像是变成了量子态一样不可观测,找了很久都找不到原因。
但其表现总归是覆写方法的过滤器没有执行到,因此直接更换过滤器注册方式。最后问题不再出现。
根据查询到的资料发现,其实WebFilter声明的过滤器执行是没有明确的顺序的,执行顺序不可控。
很多资料都说到了这一点,但是没有给出令人信服的原因。参考资料2中倒是有具体分析,说是通过扫描加载过滤器类文件的时候调用了File类的list方法,该方法不保证文件的有序性。
* <p> There is no guarantee that the name strings in the resulting array
* will appear in any specific order; they are not, in particular,
* guaranteed to appear in alphabetical order.
这样问题就能解释得通了。通过WebFilter注册的过滤器执行顺序不

最低0.47元/天 解锁文章
586

被折叠的 条评论
为什么被折叠?



