shiro框架学习-9-shiroSession
Posted enjoyjava
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro框架学习-9-shiroSession相关的知识,希望对你有一定的参考价值。
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()登录,安全性更高
以上是关于shiro框架学习-9-shiroSession的主要内容,如果未能解决你的问题,请参考以下文章