目录
1 shiro 会话的类图
1.1 Session 接口
2. DelegatingSession 类(一种类型的会话类)
3. ProxiedSession 类(一种类型的会话类)
4. SimpleSession类 (常用的 会话类)
5. StoppingAwareProxiedSession 类(很重要的会话类)
public interface Session {
Serializable getId(); //获取会话Id
Date getStartTimestamp(); //获取会话创建时间
Date getLastAccessTime(); //获取上一次访问会话的时间
long getTimeout() throws InvalidSessionException; //获取会话过期时间
void setTimeout(long var1) throws InvalidSessionException; //设置会话的过期时间
String getHost(); //获取此会话用户的主机地址
void touch() throws InvalidSessionException; //访问一次会话,并不做任何
void stop() throws InvalidSessionException; //停止会话,就是删除
Collection
可以看到,大部分都是实现Session接口的方法,通过看到源码,可以得到的领悟是:Session中只是对自我属性的一些维护,SessionManager 会话管理器,就是提供对Session的各种操作方法,就称之为管理器。
DelegatingSession实现了Serializable接口,也是可以直接用于存储 和 网络传输的,但是没有显示指定serialVersionUID,就是JDK默认生成,如果(JDK版本不一样,很可能会出现反序列化问题:https://blog.csdn.net/dgh112233/article/details/100573649)
public class DelegatingSession implements Session, Serializable {
private final SessionKey key; //定义一个接口,此接口的作用是提供获取sessionId的方法,默认由DefaultSessionKey实现
private Date startTimestamp = null; //会话创建时间
private String host = null; //会话用户主机
private final transient NativeSessionManager sessionManager; //会话管理器
public DelegatingSession(NativeSessionManager sessionManager, SessionKey key) {
if (sessionManager == null) { //每一个Session都必须与会话管理器挂钩
throw new IllegalArgumentException("sessionManager argument cannot be null.");
} else if (key == null) { //sessionKey 对象不能为空
throw new IllegalArgumentException("sessionKey argument cannot be null.");
} else if (key.getSessionId() == null) { //sessionId不能为空
String msg = "The " + DelegatingSession.class.getName() + " implementation requires that the SessionKey argument returns a non-null sessionId to support the Session.getId() invocations.";
throw new IllegalArgumentException(msg);
} else {
this.sessionManager = sessionManager;
this.key = key;
}
}
public Serializable getId() { //获取会话Id
return this.key.getSessionId();
}
public Date getStartTimestamp() { //获取会话创建时间
if (this.startTimestamp == null) {
this.startTimestamp = this.sessionManager.getStartTimestamp(this.key);
}
return this.startTimestamp;
}
public Date getLastAccessTime() { //获取上一次访问时间
return this.sessionManager.getLastAccessTime(this.key);
}
public long getTimeout() throws InvalidSessionException { //获取过期时间
return this.sessionManager.getTimeout(this.key);
}
//后面的get set方法就不多说了
public void setTimeout(long maxIdleTimeInMillis) throws InvalidSessionException {
this.sessionManager.setTimeout(this.key, maxIdleTimeInMillis);
}
public String getHost() {
if (this.host == null) {
this.host = this.sessionManager.getHost(this.key);
}
return this.host;
}
public void touch() throws InvalidSessionException {
this.sessionManager.touch(this.key);
}
public void stop() throws InvalidSessionException {
this.sessionManager.stop(this.key);
}
public Collection
proxied 英语意思就是 “代理”,何为代理,个人理解:就是在某个会话类的基础上再封装一次,通过操作这个代理的各种方法来达到操作某个会话类的目的,就好像代理商和厂家一样,你直接去厂家买,厂家不会卖给你的,你只有去代理商那里说你要什么东西,用户是直接跟代理商交互,代理商跟厂家直接交互,以此来达到,用户间接地与厂家交互。
public class ProxiedSession implements Session {
protected final Session delegate; //被代理的Session
public ProxiedSession(Session target) { //构造函数
if (target == null) {
throw new IllegalArgumentException("Target session to proxy cannot be null.");
} else {
this.delegate = target;
}
}
public Serializable getId() { //获取会话Id
return this.delegate.getId();
}
public Date getStartTimestamp() { //获取会话创建时间
return this.delegate.getStartTimestamp();
}
public Date getLastAccessTime() { //获取会话上一次访问时间
return this.delegate.getLastAccessTime();
}
public long getTimeout() throws InvalidSessionException { //获取过期时间
return this.delegate.getTimeout();
}
public void setTimeout(long maxIdleTimeInMillis) throws InvalidSessionException {
this.delegate.setTimeout(maxIdleTimeInMillis); //设置会话过期时间
}
public String getHost() { //设置会话用户的主机
return this.delegate.getHost();
}
public void touch() throws InvalidSessionException { //空访问方法
this.delegate.touch();
}
public void stop() throws InvalidSessionException { //停止会话
this.delegate.stop();
}
public Collection
这个会话类是shiro提供的,属性比较全,方法也比较全,一般默认是使用的这个会话类。
StoppingAwareProxiedSession 类是DelegatingSubject类的一个内部类,继承了ProxiedSession类,这个类的作用是:将我们的会话 与 用户关联起来,这样就知道哪个用户用的会话是哪个。
private class StoppingAwareProxiedSession extends ProxiedSession {
private final DelegatingSubject owner; //此会话的用户
// 构造函数
private StoppingAwareProxiedSession(Session target, DelegatingSubject owningSubject) {
super(target);
this.owner = owningSubject;
}
public void stop() throws InvalidSessionException { //停止会话
super.stop();
this.owner.sessionStopped();
}
}