1. 类图
可以看出,shiro里的此接口实现比较简单。
1.1 SessionKey 接口
public interface SessionKey {
Serializable getSessionId(); //获取会话Id
}
2. DefaultSessionKey 类
public class DefaultSessionKey implements SessionKey, Serializable {
private Serializable sessionId; //会话Id
public DefaultSessionKey() { }
public DefaultSessionKey(Serializable sessionId) {
this.sessionId = sessionId;
}
public void setSessionId(Serializable sessionId) {
this.sessionId = sessionId;
}
public Serializable getSessionId() {
return this.sessionId;
}
}
可以看到,这个类就是对SessionKey接口的简单实现, 另外,还实现了Serializable接口,说明这个类的实例化对象是可以用于持久化存储 和 网络传输,但是没有显示指定 serialVersionUID 的值,所以是JDK生成的,那么就会存在反序列化失败的情况(JDK版本不同,具体请查看https://blog.csdn.net/dgh112233/article/details/100573649)
3. WebSessionKey 类
public class WebSessionKey extends DefaultSessionKey implements RequestPairSource {
private final ServletRequest servletRequest; //http的request
private final ServletResponse servletResponse; //http的response
public WebSessionKey(ServletRequest request, ServletResponse response) {
if (request == null) {
throw new NullPointerException("request argument cannot be null.");
} else if (response == null) {
throw new NullPointerException("response argument cannot be null.");
} else {
this.servletRequest = request;
this.servletResponse = response;
}
}
public WebSessionKey(Serializable sessionId, ServletRequest request, ServletResponse response) {
this(request, response);
this.setSessionId(sessionId);
}
public ServletRequest getServletRequest() {
return this.servletRequest;
}
public ServletResponse getServletResponse() {
return this.servletResponse;
}
}
这个类是DefaultSessionKey的基础上,集成了HTTP的东西,getServletRequest 和 getServletResponse 两个方法是实现的RequestPairSource接口的。意思就是SessionKey的web版本是将我们的SessionId 和 request、response两个东西关联起来。