1.什么是会话session :
用户和程序直接的链接,程序可以根据session识别到哪个用户,和javaweb中的session类似
2. 什么是会话管理器SessionManager :
会话管理器管理所有subject的所有操作,是shiro的核心组件,它是一个接口,定义如下:
public interface SessionManager { // 开启一个session Session start(SessionContext var1); // 根据指定的key获取session Session getSession(SessionKey var1) throws SessionException; }
shiro中的会话管理器有多个实现:
3. shiroSession 会话存储/持久化:
shiro的SessionDao接口,提供了session的创建,获取,更新,删除,获取所有session的方法
public interface SessionDAO { Serializable create(Session var1); Session readSession(Serializable var1) throws UnknownSessionException; void update(Session var1) throws UnknownSessionException; void delete(Session var1); Collection<Session> getActiveSessions(); }
它的实现类如下,自定义缓存管理器,可以继承 AbstractSessionDAO
AbstractSessionDAO 源码如下:
package org.apache.shiro.session.mgt.eis; import java.io.Serializable; import org.apache.shiro.session.Session; import org.apache.shiro.session.UnknownSessionException; import org.apache.shiro.session.mgt.SimpleSession; public abstract class AbstractSessionDAO implements SessionDAO { private SessionIdGenerator sessionIdGenerator = new JavaUuidSessionIdGenerator(); public AbstractSessionDAO() { } public SessionIdGenerator getSessionIdGenerator() { return this.sessionIdGenerator; } public void setSessionIdGenerator(SessionIdGenerator sessionIdGenerator) { this.sessionIdGenerator = sessionIdGenerator; } // shiro默认使用了uuid来产生sessionId,如果需要自定义sessionId,可以实现SessionIdGenerator接口,实现其中的方法 protected Serializable generateSessionId(Session session) { if (this.sessionIdGenerator == null) { String msg = "sessionIdGenerator attribute has not been configured."; throw new IllegalStateException(msg); } else { return this.sessionIdGenerator.generateId(session); } } public Serializable create(Session session) { Serializable sessionId = this.doCreate(session); this.verifySessionId(sessionId); return sessionId; } private void verifySessionId(Serializable sessionId) { if (sessionId == null) { String msg = "sessionId returned from doCreate implementation is null. Please verify the implementation."; throw new IllegalStateException(msg); } } protected void assignSessionId(Session session, Serializable sessionId) { ((SimpleSession)session).setId(sessionId); } protected abstract Serializable doCreate(Session var1); public Session readSession(Serializable sessionId) throws UnknownSessionException { Session s = this.doReadSession(sessionId); if (s == null) { throw new UnknownSessionException("There is no session with id [" + sessionId + "]"); } else { return s; } } protected abstract Session doReadSession(Serializable var1); }
4. RememberMe功能
1、 Cookie 写到客户端并 保存
2、 通过调用subject.login()前,设置 token.setRememberMe(true);
3、 关闭浏览器再重新打开;会发现浏览器还是记住你的
4、 注意点:
- subject.isAuthenticated() 表示用户进行了身份验证登录的,即Subject.login 进行了登录
- subject.isRemembered() 表示用户是通过RememberMe登录的
- subject.isAuthenticated()==true,则 subject.isRemembered()==false, 两个互斥
- 特殊页面或者API调用才需要authc进行验证拦截,该拦截器会判断用户是否是通过 subject.login()登录,安全性更高
原文地址:https://www.cnblogs.com/enjoyjava/p/12089473.html