关于shiro的一个疑问,一直困扰我很久。
利用shiro进行登陆认证的时候,回调了doGetAuthenticationInfo()方法,登陆成功后
return new SimpleAuthenticationInfo(user,password..)。可是我一直有一个疑问,就是用户,再次发请求的时候,在程序调用
SecurityUtils.getSubject().getPrincipal()可以拿到当前用户,也就是return new SimpleAuthenticationInfo(user,password..)中的
user对象。也可以在程序中调用SecurityUtils.getSubject().isAuthenticated()来验证用户是否处于登陆状态;我觉得奇怪的一点是,
shiro在调用getSubject()的时候凭什么可以获取到当前会话的用户,它到底是如何保持与当前用户的会话的。
如果是传统保持会话的做法,我会在controller层中接受request对象,然后getSession,因为request中包含了用户传来的
cookies,也就是意味着我能拿到sessionId,然后根据sessionId获取当前用户session,我只要把用户信息user对象放在session里面就可以达到保持会话了。可是shiro我看不出他是怎么做到保持会话的,SecurityUtils.getSubject().getPrincipal(),这句话随便在代码的任何地方调用都能拿到当前用户信息,尽管在controller接受的参数连request都没有,也就是说shiro应该是无法拿到用户的
cookies中的sessionId。我知道我想错了,shiro登陆后,肯定把sessionid写会到了客户端,然后每次都能根据这个sessionid获取当前用户,或者不是sessionId,而是其他唯一的标识,反正是类型sessionId的东西。那它到底是如何拿到的,看源码看半天没看出来。
还有一个疑问就是,shiro也有自己的session,难道shiro会默认把user对象缓存在自己的session里面吗?而不是使用
servlet的session。如果我用servlet产生了一个session,同时根据这个sessionid去shiro框架自己的session可以取得到吗?这两种session互通的吗?最近项目老是出现串号问题,脑子越想越乱,不知道是不是shiro导致我的登陆串号了。万分感谢大神帮忙解释。