`
nod0620
  • 浏览: 19680 次
  • 性别: 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.5tomcat最新客户端

    tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat...

    tomcat7tomcat8tomcat9

    内含tomcat7 tomcat8 tomcat9免安装版本;供需要的人下载。

    tomcat7,tomcat8,tomcat9

    包含tomcat7,tomcat8,tomcat9,解压、在eclipse配置好即可。

    tomcat6、tomcat7、tocmat8、tomcat9 linux版、windox版百度云

    tomcat6、tomcat7、tocmat8、tomcat9 linux版、windox版 32位 64位

    tomcat8.0版本下载

    tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本下载tomcat8.0版本...

    tomcat 5.0 tomcat 5.0

    tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0tomcat 5.0

    apache-tomcat-9.0.45-windows-x64

    apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-...

    apache-tomcat-10.0.8.zip

    Apache Tomcat 软件是Jakarta Servlet、 Jakarta Server Pages、 Jakarta Expression Language、 Jakarta WebSocket、 Jakarta Annotations和 Jakarta Authentication 规范的开源实现 。 压缩包内容: apache-...

    开发工具 apache-tomcat-8.0.41-windows-x86

    开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-...

    Tomcat Tomcat Tomcat Tomcat

    Tomcat Tomcat Tomcat Tomcat

    Tomcat7下载(apache-tomcat-7.0.85)

    Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)

    tomcat8资源下载链接tomcat8

    tomcat8资源下载链接tomcat8tomcat8资源下载链接tomcat8tomcat8资源下载链接tomcat8tomcat8资源下载链接tomcat8

    tomcat 7 最新版本 apache-tomcat-7.0.109

    tomcat 7 最新版本 apache-tomcat-7.0.109

    tomcat安装包~~

    部署网站必不可缺少的tomcat安装包~~部署网站必不可缺少的tomcat安装包~~部署网站必不可缺少的tomcat安装包~~部署网站必不可缺少的tomcat安装包~~部署网站必不可缺少的tomcat安装包~~部署网站必不可缺少的tomcat...

    BAT脚本监控tomcat

    先决条件:tomcat为绿色版 第一步:新建系统环境变量 变量名称:CATALINA HOME 变量值:tomcat的根路径 第二步:打开cmd命令 把路径调整至tomcat的bin目录下面 第三步:在bin目录下的命令行输入 service bat ...

    tomcat6,用于idea适配低版本的tomcat

    tomcat6,用于idea适配低版本的tomcat

    Tomcat + SLF4J + Logback 2017年10月最新包(Tomcat7~9)

    Tomcat7.0.82\tomcat-slf4j-logback-tomcat7.zip Tomcat8.0.47\tomcat-juli-8.0.47-slf4j-1.7.25-logback-1.2.3.zip Tomcat8.0.47\tomcat-slf4j-logback-tomcat8.zip Tomcat8.5.23\tomcat-juli-8.5.23-slf4j-1.7.25-...

    tomcat-juli.jar和tomcat-juli-adapters.jar

    tomcat-juli.jar和tomcat-juli-adapters.jar tomcat-juli.jar和tomcat-juli-adapters.jar

    tomcat-redis-session-manager-1.2-tomcat-7-java-7

    tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-...

    tomcat 系列tomcat 系列

    tomcat 系列tomcat 系列tomcat 系列

Global site tag (gtag.js) - Google Analytics