Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器Tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对Web的透明支持、SSO单点登录的支持等特性
即直接使用Shiro的会话管理可以直接替换Web容器的会话管理
1 会话简介
即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据
如访问一些网站时登录成功后,网站可以记住用户,且在退出之前都可以识别当前用户是谁。
Shiro的会话支持不仅可以在普通的JavaSE应用中使用,也可以在JavaEE应用中使用,如web应用。且使用方式是一致的。login("classpath:shiro.ini", "zhang", "123");
Subject subject = SecurityUtils.getSubject();
Session session = subject.getSession();
登录成功后使用Subject.getSession()即可获取会话
其等价于Subject.getSession(true)
即如果当前没有创建Session对象会创建一个;另外Subject.getSession(false),如果当前没有创建Session则返回null(不过默认情况下如果启用会话存储功能的话在创建Subject时会主动创建一个Session)
DelegatingSubject#getSession(boolean create)
获取当前会话的唯一标识session.getId();
获取当前Subject的主机地址,该地址是通过HostAuthenticationToken.getHost()提供的session.getHost();
获取/设置当前Session的过期时间;如果不设置默认是会话管理器的全局过期时间session.getStartTimestamp()session.getLastAccessTime();
获取会话的启动时间及最后访问时间;如果是JavaSE应用需要自己定期调用session.touch()去更新最后访问时间;如果是Web应用,每次进入ShiroFilter都会自动调用session.touch()来更新最后访问时间更新会话最后访问时间及销毁会话
当Subject.logout()
会自动调用stop
销毁会话
在web中,调用javax.servlet.http.HttpSession. invalidate()
也会自动调用Shiro Session.stop方法进行销毁Shiro的会话
设置/获取/删除会话属性;在整个会话范围内都可以对这些属性进行操作session.setAttribute("key", "123");
Assert.assertEquals("123", session.getAttribute("key"));
session.removeAttribute("key");
Shiro提供的会话可以用于JavaSE/JavaEE环境,不依赖于任何底层容器,可以独立使用,是完整的会话模块
2 会话管理器
Shiro的核心组件,会话管理器管理着应用中所有Subject的会话的创建、维护、删除、失效、验证等工作