`
nod0620
  • 浏览: 20074 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

tomcat StandardSession

阅读更多

  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
分享到:
评论

相关推荐

    tomcat5.5源代码

    `org.apache.catalina.session`包包含了会话管理的相关类,如`ManagerBase`和`StandardSession`,它们负责创建、存储、检索和废弃Web应用程序中的用户会话。 6. **安全和认证**: Tomcat的安全功能在`org.apache....

    tomcat原理

    - **StandardSession**:用于管理用户的会话信息。 3. **Host组件**: - **VirtualHost**:支持多个虚拟主机,可以通过不同的域名访问同一个Tomcat服务器上的不同应用。 4. **Engine组件**: - **...

    集群 Tomcat 6.x 和 Tomcat 7.x,使用 redis 存储会话.zip

    集群 Tomcat 6.x 和 Tomcat 7.x,使用 redis 存储会话实现RedisManager继承org.apache.catalina.session.StandardManager,RedisSession继承org.apache.catalina.session.StandardSession。安装步骤:1. 复制:wjw-...

    Tomcat7 核心包 catalina包源码

    例如,`Manager`接口及其实现类如`StandardSession`,负责Session的创建、销毁和存储。`Realm`接口及其实现,如`MemoryRealm`和`JaasRealm`,用于用户身份验证和授权。 总的来说,Tomcat7的Catalina源码揭示了其...

    tomcat-redis-session.rar

    1. **Tomcat会话管理**:Tomcat默认使用基于内存的`org.apache.catalina.session.StandardSession`实现来存储session信息。每个session对象包含了用户的登录状态、购物车等信息。 2. **Redis介绍**:Redis是一个...

    TOMCAT_7_0_27源代码

    在源代码中,你可以看到`Manager`接口及其实现类,如`StandardSession`,它们负责创建、跟踪和销毁会话。 4. **安全性** Tomcat提供了多种安全特性,如角色基础的访问控制、SSL/TLS支持、Basic和Digest认证等。源...

    tomcat 6.0源码

    `org.apache.catalina.session`包下的类如`ManagerBase`和`StandardSession`揭示了这一过程。 6. **安全性**:Tomcat支持多种安全认证方式,如Basic、Digest、Form等。`org.apache.catalina.authenticator`包包含了...

    tomcat-8.5.42:tomcat源码编译与学习

    tomcat-8.5.42:tomcat源码编译与学习

    tomcat-cassandra-session-manager:Tomcat Cassandra会话管理器

    常见的会话管理技术包括cookie、URL重写和基于服务器的会话管理,如Tomcat的StandardSession。 3. **Cassandra分布式数据库**:Apache Cassandra是一个高度可扩展的NoSQL数据库,设计用于处理大规模数据分布式存储...

    Tomcat如何监控并删除超时Session详解

    前言 偶然发现Tomcat会话时间的半小时,并不是说会话创建后,... StandardSession是标准的HttpSession实现,同时它也实现了Session接口,用于Tomcat内部管理 StandardSessionFacade,类名已经指明它就是一个“门面

    Tomcat 是如何管理Session的方法示例

    在Tomcat中,这个过程是由`StandardSession`类完成的,它是`HttpSession`接口的一个实现。`StandardSession`内部使用了线程安全的`ConcurrentHashMap`来存储用户数据,这是因为Web应用中的请求可能并发地访问同一个...

    深入浅析TomCat Session管理分析

    - **StandardSession**: 实现了`HttpSession`,是Tomcat的标准HTTP Session实现,负责处理Session的生命周期和属性管理。 - **ReplicatedSessionManager**: 应用ReplicatedSession策略的管理器。 - **...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    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(换...

    TomcatSourceReview:Tomcat源码阅读

    默认的`StandardSession`类实现会话对象,包含了会话属性、超时逻辑等。会话持久化可以通过`Manager`的实现来实现,例如文件存储或数据库存储。 Tomcat的安全特性也不容忽视。`Realm`组件负责认证和授权,它可以...

    servlet源码

    6. **会话管理**:`org.apache.catalina.session`包下的类处理用户会话,如`ManagerBase`和`StandardSession`。 7. **安全性**:`org.apache.catalina.authenticator`包提供了身份验证和授权的实现。 通过阅读这些...

    session.会话实例源码

    例如,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....

Global site tag (gtag.js) - Google Analytics