最近通过shiro开发一个基于dubbo的鉴权服务,在测试阶段登录的场景下遇到这个问题,做个记录。

异常信息如下:

异常是由DefaultSessionManager抛出来的:

login栈

实际上应用调用shior默认的subject.login(token)进行登录,是不应该去寻找sessionid的,而是通过seesionmanager生成一个新的sessionid.

创建方法0

可以看一下login的实现,通常是使用token参数就够了,框架获取当前的subject,再调用上图的login方法.

在看一下createSubject的过程,传入了三个参数,最后一个参数就是框架本身获取的.

创建方法1

创建方法内部,如果传入的subject不为空,则会进行设置上下文,一旦有了这个上下文,则会通过上下文去解析sessionkey,代码如下:

获取sessionkey

这里如果没有上下文,获取的key为空,如果获取到key,则进行session的解析处理,解析出现异常就出现了上面的堆栈信息,因为拿到的sessionId找不到实际的session内容.可能已过期可能已清理.

再回头看一下获取subject的过程:

获取Subject

框架本身维持了一个ThreadLocal,用来和当前线程绑定subject,在多线程的环境下,使用同一个subject实例则会导致其他线程登录后获取到共同的上下文,导致异常,例如:

通过sessionid获取subject:

 

 

发表评论