会话
会话,即用户保持和服务端之间的联系,保证用户在下一次访问服务端时不必在提交用户身份信息。而服务端可以通过用户提交的sessionId判断用户身份。
Subject subject = SecurityUtils.getSubject();
Session session = subject.getSession()
可以通过以上方法获取当前登录用
/**
*Subject.getSession(true),即如果当前没有创建session对象会创建一个;
*Subject.getSession(false),如果当前没有创建session对象则返回null。
*/
Subject.getSession();//等价于Subject.getSession(true)
session.getId();//获取当前会话的唯一标识。
session.getHost();//获取当前会话的主机地址。
session.getTimeout() & session.setTimeout(毫秒);//设置/获取当前Session的过期时间。
/**获取会话的启动时间及最后访问时间;
*如果是J2SE环境需要自己定期调用session.touch()去更新最后访问时间;
*如果是Web环境,每次进入ShiroFilter都会自动调用session.touch()来更新最后访问时间。
*/
session.getStartTimestamp() & session.getLastAccessTime();
/**
*更新会话最后访问时间以及销毁会话;
*Subject.logout()会自动调用session.stop()。
*在Web应用中,调用HttpSession.invalidate()也会自动调用session.stop()来销毁shiro的会话。
*/
session.touch() & session.stop();
session.setAttribute(key,val) & session.getAttribute(key) & session.removeAttribute(key);//设置/获取/删除 会话属性。
会话管理
shiro中的会话管理器管理所有Subject的会话的创建、删除、验证、失效等。shiro中会话管理的结构图如下:
发现SecurityManager继承了SessionManager接口,而SecurityManager结构图如下:
发现SessionSecurityManager实现了接口SecurityManager,实质SessionSecurityManager实现了把会话管理委托给对应的SessionManager。而DefaultSecurityManager和DefaultWebSecurityManager都继承了SessionSecurityManager
会话监听器
自定义类实现SessionListener接口,并实现其中的方法。SessionListener方法如下:
- onStart(Session):创建会话时触发该事件
- onStop(Session):销毁会话时触发该事件
- onExpiration(Session):会话过期时触发该事件