Shiro的会话实际上跟HTTPSession是一致的,都是表示客户端和服务器的一次会话。
一、Shiro的会话特点
不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对Web的透明支持、SSO单点登录的支持等特性。
二、会话相关的API
1、Subject.getSession():即可获取会话;其等价于Subject.getSession(true),即如果当前没有创建Session对象就会创建一个;Subject.getSession(false),如果当前没有创建Session则返回null。
2、session.getId():获取当前会话的唯一标识
3、session.getHost():获取当前Subject的主机地址
4、session.getTimeout() & session.setTimeout(毫秒):获取/设置当前session的过期时间
5、session.getStartTimestamp() & session.getLastAccessTime():获取会话的启动时间及最后访问时间。
6、session.touch() & session.stop():更新会话的最后访问时间及销毁时间;当Subject.logout()时会自动调用stop()方法来销毁会话。如果在web中,调用HttpSession.invalidate()也会自动调用Shiro Session.stop方法进行销毁Shiro的会话。
7、session.setAttribute(key,val) & session.getAttribute(key) & session.removeAttribute(key):设置/获取/删除会话属性,在整个会话范围内都可以对这些属性进行操作。
三、会话监听器
监听会话的创建,停止和过期事件。
SessionListener
onStart(Session):void
onStop(Session):void
onExpiration(Session):void
四、Shiro的Session的使用
在Controller创建一个session并给session赋值
@RequestMapping(value = "test")
public String test(HttpSession session){
session.setAttribute("testSession", "测试Shiro的session");
shiroService.test();
return "redirect:/list.jsp";
}
在service中可以获取到session:
@RequiresRoles({"admin"})
public void test(){
Session session = SecurityUtils.getSubject().getSession();
System.out.println("Shiro Session:" + session.getAttribute("testSession"));
System.out.println("ShiroService测试权限:" + new Date());
}