shiro拦截器不生效——玄学问题的本质

木来 木来
HashMap是无序的

今天晚上出门前,代码还好好的,能够顺利的运行出自己想要的结果。

出门回来之后,写了一个功能,因为这个功能是可以匿名访问的,所以需要在shiro的拦截器中配置一下,让该方法可以不需要任何的权限即可访问。

我的拦截器是这样子写的:

filterChainDefinitionMap.put("/user/resetPassword","anon");

但是在此操作后,我的网站除了首页index之外的所有页面均无法访问,出现的问题为

image.png

这个白错误页面上面的错误简单来说就是,是一个错误的访问,因为其访问没有带上/user/login这个方法想要的参数,所以会显示400错误。

这个倒是我不太在意,我真正在意的是这个错误触发的根本原因是系统找不到我所要访问的资源,由此去跳转执行/user/login方法,而访问该方法时并没有附带上该方法需要的参数,由此页面反馈给我这个400错误。

而触发这个错误的根本原因是shiro拦截器没有生效。

这让我非常困惑,我明明加了一个不相干功能的拦截,按理说所有的页面均可以访问到,为什么只有首页可以访问,而其他页面全部无法访问了。


然后我想到的解决方案是,是否是因为IDEA的问题,因为我前天也遇到了一个玄学问题,解决方案是只要重启IDEA就可以,我在查到该解决方案之前,我已经浪费了3个小时。

于是我重启idea,无果。

我重启电脑,无果。

想了所有出现问题的可能,均不存在任何问题。

我尝试把我之前认为正确的shiro新加的功能拦截去掉,结果竟然又可以正常访问页面了,这让我更加困惑,什么鬼??玄学吗?

我尝试多次验证该操作是否真的可以影响我的系统运行,于是我多次添加shiro拦截后运行tomcat,删除shiro拦截运行tomcat,证实该操作确实影响了我的系统运行。

这让我更加困惑,为什么一个新加的拦截可以影响我的系统运行?

在查阅了大量的资料之后,仍不能解决我的问题,网上没有任何一个程序员出现与我相似的问题。

当浏览一个问题“shiro拦截无法生效”时,看到某CSDN博主的拦截器配置,突然想到了一个致命的问题,HashMap是无序的,而我拦截器是使用的HashMap,会不会把我设置的最核心的登录后拦截给放到了序列前面,由此访问任何资源都是需要登录的,即在没有任何权限的情况下找不到该资源。

说干就干,我又重新在shiro拦截器的配置下了断点,认真的去执行每一步操作,终于发现了问题所在。

当拦截数量保持在一定的范围时,最核心的登录后拦截一直在最后面,而当超过这个范围时,最核心的登录拦截就跑到了前面去。


在一定范围内,/** authc拦截器在最后面:

image.png

好,下面我随便加一条拦截,拦截的顺序就发生了变化

image.png

这导致我画红线的拦截下面所有的拦截全部失效。

当搞到这里的时候,我就想砸键盘了,如果一直想不出解决方案。。那后果不堪设想,可能会自闭好几天。

找到了问题所在,那解决方案就很简单了,核心就是让Map集合变得有序,我选择链式结构,于是修改配置拦截为链式结构即可。

Map<String, String> filterChainDefinitionMap = Maps.newLinkedHashMap();

然后我在发一下链表结构之后拦截的顺序

image.png

这样就解决了我的bug。

0 条评论