Tomcat中Session的实现还是比较清晰的,先看类图:
其中HttpSession是Servlet Api,从类图看出来,这里使用了facade模式,StandardSessionFacade为一个门面,而 HttpSession的真正的实现类为StandardSession,它还实现了一个在tomcat内部使用的Session接口,这里讲的都是单台Tomcat的Session,tomcat集群是另外一套的代码。
Manager接口的实现是Session的管理者,保存着这台tomcat中所有的Session.Manager在Context启动的时候被创建,被启动.
在Servlet api中HttpServletRequest的getSession()方法最后面定位到的就是ManagerBase的createSession()方法,当然在这个以前,会查看是否已经存在session,有的话就直接返回了, 所以HttpServletRequest的getSession(boolean create)方法可以指定是否在没有找到session的情况下创建session。
public Session createSession(String sessionId) {
// Recycle or create a Session instance
Session session = createEmptySession();
// Initialize the properties of the new session and return it
session.setNew(true);
session.setValid(true);
session.setCreationTime(System.currentTimeMillis());
session.setMaxInactiveInterval(this.maxInactiveInterval);
if (sessionId == null) {
sessionId = generateSessionId();
// FIXME WHy we need no duplication check?
/*
synchronized (sessions) {
while (sessions.get(sessionId) != null) { // Guarantee
// uniqueness
duplicates++;
sessionId = generateSessionId();
}
}
*/
// FIXME: Code to be used in case route replacement is needed
/*
} else {
String jvmRoute = getJvmRoute();
if (getJvmRoute() != null) {
String requestJvmRoute = null;
int index = sessionId.indexOf(".");
if (index > 0) {
requestJvmRoute = sessionId
.substring(index + 1, sessionId.length());
}
if (requestJvmRoute != null && !requestJvmRoute.equals(jvmRoute)) {
sessionId = sessionId.substring(0, index) + "." + jvmRoute;
}
}
*/
}
session.setId(sessionId);
sessionCounter++;
return (session);
}
首先创建一个空的Session,然后是设置各种属性,比较重要的是在sessionId没有传入的情况下,生成一个唯一的sessionId的过程。
protected synchronized String generateSessionId() {
byte random[] = new byte[16];
String jvmRoute = getJvmRoute();
String result = null;
// Render the result as a String of hexadecimal digits
StringBuffer buffer = new StringBuffer();
do {
int resultLenBytes = 0;
if (result != null) {
buffer = new StringBuffer();
duplicates++;
}
while (resultLenBytes < this.sessionIdLength) {
getRandomBytes(random);
random = getDigest().digest(random);
for (int j = 0;
j < random.length && resultLenBytes < this.sessionIdLength;
j++) {
byte b1 = (byte) ((random[j] & 0xf0) >> 4);
byte b2 = (byte) (random[j] & 0x0f);
if (b1 < 10)
buffer.append((char) ('0' + b1));
else
buffer.append((char) ('A' + (b1 - 10)));
if (b2 < 10)
buffer.append((char) ('0' + b2));
else
buffer.append((char) ('A' + (b2 - 10)));
resultLenBytes++;
}
}
if (jvmRoute != null) {
buffer.append('.').append(jvmRoute);
}
result = buffer.toString();
} while (sessions.containsKey(result));
return (result);
}
在单台tomcat的情况下,jvmRoute是null的,这个随机数产生主要是要平衡,每次要求产生都尽可能的不一样,首先是new一个byte的数组,然后先去文件里面读取随机数,如果不行的话,需要产生一个种子来初始化一个随机数生成器然后生成随机数,之后进行MD5的计算,当然还是要判断一下这个id是不是已经存在了.
StandardManager还有很有意思的方法,在stop()方法中会调用unload()方法,这个方法把session的数据保存到文件中,当然也可以从文件中读书,这个文件存在于tomcat work对应项目目录下面的SESSIONS.ser文件中.
StandardSession中还有几个方法是对应Session Listener的,这些Session Listener是在Servlet Api中的,这样子的话,我们在外面实现这些类的时候,可以对应在Session发生变化的时候,tomcat有个回调我们类的机会
这些listener有:
HttpSessionListener 在session创建和销毁时用(StandardSession.setId(),StandardSession.expire())
HttpSessionActivationListener 在session钝化和反钝化时用(StandardSession.doUnload(),StandardSession.doload())
HttpSessionAttributeListener 在session的attributes属性发生变化时
- 大小: 4.8 KB
分享到:
相关推荐
`org.apache.catalina.session`包包含了会话管理的相关类,如`ManagerBase`和`StandardSession`,它们负责创建、存储、检索和废弃Web应用程序中的用户会话。 6. **安全和认证**: Tomcat的安全功能在`org.apache....
- **StandardSession**:用于管理用户的会话信息。 3. **Host组件**: - **VirtualHost**:支持多个虚拟主机,可以通过不同的域名访问同一个Tomcat服务器上的不同应用。 4. **Engine组件**: - **...
集群 Tomcat 6.x 和 Tomcat 7.x,使用 redis 存储会话实现RedisManager继承org.apache.catalina.session.StandardManager,RedisSession继承org.apache.catalina.session.StandardSession。安装步骤:1. 复制:wjw-...
例如,`Manager`接口及其实现类如`StandardSession`,负责Session的创建、销毁和存储。`Realm`接口及其实现,如`MemoryRealm`和`JaasRealm`,用于用户身份验证和授权。 总的来说,Tomcat7的Catalina源码揭示了其...
1. **Tomcat会话管理**:Tomcat默认使用基于内存的`org.apache.catalina.session.StandardSession`实现来存储session信息。每个session对象包含了用户的登录状态、购物车等信息。 2. **Redis介绍**:Redis是一个...
在源代码中,你可以看到`Manager`接口及其实现类,如`StandardSession`,它们负责创建、跟踪和销毁会话。 4. **安全性** Tomcat提供了多种安全特性,如角色基础的访问控制、SSL/TLS支持、Basic和Digest认证等。源...
`org.apache.catalina.session`包下的类如`ManagerBase`和`StandardSession`揭示了这一过程。 6. **安全性**:Tomcat支持多种安全认证方式,如Basic、Digest、Form等。`org.apache.catalina.authenticator`包包含了...
tomcat-8.5.42:tomcat源码编译与学习
常见的会话管理技术包括cookie、URL重写和基于服务器的会话管理,如Tomcat的StandardSession。 3. **Cassandra分布式数据库**:Apache Cassandra是一个高度可扩展的NoSQL数据库,设计用于处理大规模数据分布式存储...
前言 偶然发现Tomcat会话时间的半小时,并不是说会话创建后,... StandardSession是标准的HttpSession实现,同时它也实现了Session接口,用于Tomcat内部管理 StandardSessionFacade,类名已经指明它就是一个“门面
在Tomcat中,这个过程是由`StandardSession`类完成的,它是`HttpSession`接口的一个实现。`StandardSession`内部使用了线程安全的`ConcurrentHashMap`来存储用户数据,这是因为Web应用中的请求可能并发地访问同一个...
- **StandardSession**: 实现了`HttpSession`,是Tomcat的标准HTTP Session实现,负责处理Session的生命周期和属性管理。 - **ReplicatedSessionManager**: 应用ReplicatedSession策略的管理器。 - **...
9.2.2 StandardSession类 63 9.2.3 StandardSessionFacade类 65 9.3 Manager 65 9.3.1 Manager接口 66 9.3.2 ManagerBase类 66 9.3.3 StandardManager类 67 9.3.4 PersistentManagerBase类 68 9.3.4.1 swap out(换...
默认的`StandardSession`类实现会话对象,包含了会话属性、超时逻辑等。会话持久化可以通过`Manager`的实现来实现,例如文件存储或数据库存储。 Tomcat的安全特性也不容忽视。`Realm`组件负责认证和授权,它可以...
6. **会话管理**:`org.apache.catalina.session`包下的类处理用户会话,如`ManagerBase`和`StandardSession`。 7. **安全性**:`org.apache.catalina.authenticator`包提供了身份验证和授权的实现。 通过阅读这些...
例如,Tomcat的`org.apache.catalina.session.StandardSession`类是`HttpSession`的一个实现,它管理着Session的生命周期、数据存储以及过期策略。源码分析可以让我们了解Session是如何在内部管理这些操作的,包括...
如Tomcat,Session数据通过`org.apache.catalina.session.ManagerBase`类进行管理,该类使用`HashMap`来存储Session,其中键为Session ID,值为`org.apache.catalina.Session`接口的实现,通常是`org.apache....