过滤器执行顺序问题分析

最近碰到了一个关于过滤器的奇怪的问题。

问题描述

项目中定义了若干过滤器,其中一个是解析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注册的过滤器执行顺序不

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值