SessionDao

Shiro提供SessionDAO用于会话的CRUD,源码如下:

package org.apache.shiro.session.mgt.eis;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;

import java.io.Serializable;
import java.util.Collection;

public interface SessionDAO

// 创建session
Serializable create(Session session);

// 获取session
Session readSession(Serializable sessionId) throws UnknownSessionException;

// 更新session
void update(Session session) throws UnknownSessionException;

// 删除session
void delete(Session session);

// 获取当前所有的session

AbstractSessionDAO

AbstractSessionDAO提供了SessionDAO的基础实现,如生成会话ID等,源码如下:

package org.apache.shiro.session.mgt.eis;

import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.SimpleSession;

import java.io.Serializable;

public abstract class AbstractSessionDAO implements SessionDAO

private SessionIdGenerator sessionIdGenerator;

public AbstractSessionDAO() {
this.sessionIdGenerator = new JavaUuidSessionIdGenerator();
}

public SessionIdGenerator getSessionIdGenerator() {
return sessionIdGenerator;
}

public void setSessionIdGenerator(SessionIdGenerator sessionIdGenerator) {
this.sessionIdGenerator = sessionIdGenerator;
}

protected Serializable generateSessionId(Session session) {
if (this.sessionIdGenerator == null) {
String msg = "sessionIdGenerator attribute has not been configured.";
throw new IllegalStateException(msg);
}
return this.sessionIdGenerator.generateId(session);
}

public Serializable create(Session session) {
Serializable sessionId = doCreate(session);
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 session);

public Session readSession(Serializable sessionId) throws UnknownSessionException {
Session s = doReadSession(sessionId);
if (s == null) {
throw new UnknownSessionException("There is no session with id [" + sessionId + "]");
}
return s;
}

protected abstract Session doReadSession(Serializable sessionId);

}