首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

Tomcat的JessionId解决方法

2013-11-15 
Tomcat的JessionIdtomcat会生成jessionId传递给浏览器,浏览器保存在会话cookie中,当浏览器再去向服务器发

Tomcat的JessionId
tomcat会生成jessionId传递给浏览器,浏览器保存在会话cookie中,当浏览器再去向服务器发送请求的时候,这个jessionId也会发送到服务器端,通过jessionId来找到服务器端为用户维持的一个session。我想求教的是,这个jessionId是在什么时候生成并发送给浏览器的呢?···为什么我第一次访问服务器的时候,这个jessionId已经存在到http的header中了?··· tomcat,jessionId
[解决办法]
jessionid是用来标示session的唯一值的。你可以认为产生一个session,就会产生对应的一个jessionid。
但是这个jessionid是保存在cookie中的,所以你请求的时候header中会带上从客户端的cookie中获取到的jessionid。
再来从session产生的角度阐述下:
登陆后,你的确得到了session,也拥有了一个session id(jsessionid),如果你一分钟不动,属于你的session会失效。但此时你的jsessionid并没有变(存在cookie中),因为此时你的jsessionid是放在了你浏览器的cookies中的。如果你这时进行操作,浏览器会将你的jsessionid传送到服务器(也就是你看到的header头中有),服务器拿这个jsessionid去找属于你的session,但不好意思,这时找不到了,因为超时后被干掉了。
[解决办法]
下面是Tomcat 生成SessionId 的代码,是会检查是否有重复的......


    protected String generateSessionId() {

        String result = null;

        do {
            if (result != null) {
                // Not thread-safe but if one of multiple increments is lost
                // that is not a big deal since the fact that there was any
                // duplicate is a much bigger issue.
                duplicates++;
            }

            result = sessionIdGenerator.generateSessionId();
            
        } while (sessions.containsKey(result));
        
        return result;
    }
public String generateSessionId() {

        byte random[] = new byte[16];

        // Render the result as a String of hexadecimal digits
        StringBuilder buffer = new StringBuilder();

        int resultLenBytes = 0;

        while (resultLenBytes < sessionIdLength) {
            getRandomBytes(random);
            for (int j = 0;
            j < random.length && resultLenBytes < 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 && jvmRoute.length() > 0) {


            buffer.append('.').append(jvmRoute);
        }

        return buffer.toString();
    }


热点排行