刚学shiro不久,在相同的subject重复登录时,也就是登陆成功的subject再次登录时出现空指针异常.出现的位置是处理登陆失败的controller方法.
我往前追溯发现是shiro的filter在认证的时候是先通过isAceessAllowed()方法的实现进行判断是否已经登录认证的
而这个isAceessAllowed()方法的实现如下,其实是调用了当前subject的一个isAuthencated()方法
而,这个方法是获取一个叫做authenticated的boolean参数,这个参数就是代表当前subject是否登录的标志,当你登录成功时会被赋值为true
既然来龙去脉已经明白,那么言归正传,为什么会出现空指针异常呢?原来是subject已经登录,导致isAceessAllowed()判断为真,所以过滤器直接就放行了,而shiro的配置是登录的时候用POST方式处理,所以自然而然就跳到了处理登录页的POST的Controller中,而正常情况下shiro在认证错误抛出异常的时候会直接跳转到POST的controller中,而且我在controller中写了异常类型的判断.
由于是重复登录,并没有异常错误,所有exceptionName其实是null,而在异常类型判断的时候调用了equals()所有出现了空指针异常.
解决方法就是在异常判断之前先进行非空判断,如果为空则设置返回类型为重复登录就行了.