关于shiro的一个疑问,一直困扰我很久。

szdphsw 2017-03-15 01:22:34
利用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导致我的登陆串号了。万分感谢大神帮忙解释。
...全文
636 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
连晋 2018-03-10
  • 打赏
  • 举报
回复
老兄 你用户串号的问题解决没?
showhunter74 2017-03-21
  • 打赏
  • 举报
回复
用户信息被shiro封装在了session中。如果你使用freemarker渲染有shiro权限的页面是,你就能发现,用户信息只要你想都能渲染出来
Z. ZHANG 2017-03-20
  • 打赏
  • 举报
回复
session应该是一个吧 就是shiro把你登入的信息保存在了session里 一般一个浏览器保持一个session,所以你想调试这个的话 可以用两个浏览器
好名字给猪了 2017-03-20
  • 打赏
  • 举报
回复
shiro源码里面有好多继承实现,我看晕了, 大概是登录时把用户放到一个集合里面。里面重写了 request,session这些,获取时应该是根据request,session,从集合进行匹配的。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧