日期:2014-05-18  浏览次数:20689 次

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 <