tomcat会生成jessionId传递给浏览器,浏览器保存在会话cookie中,当浏览器再去向服务器发送请求的时候,这个jessionId也会发送到服务器端,通过jessionId来找到服务器端为用户维持的一个session。我想求教的是,这个jessionId是在什么时候生成并发送给浏览器的呢?···为什么我第一次访问服务器的时候,这个jessionId已经存在到http的header中了?···tomcat,jessionId

解决方案 »

  1.   

    jessionid是用来标示session的唯一值的。你可以认为产生一个session,就会产生对应的一个jessionid。
    但是这个jessionid是保存在cookie中的,所以你请求的时候header中会带上从客户端的cookie中获取到的jessionid。
    再来从session产生的角度阐述下:
    登陆后,你的确得到了session,也拥有了一个session id(jsessionid),如果你一分钟不动,属于你的session会失效。但此时你的jsessionid并没有变(存在cookie中),因为此时你的jsessionid是放在了你浏览器的cookies中的。如果你这时进行操作,浏览器会将你的jsessionid传送到服务器(也就是你看到的header头中有),服务器拿这个jsessionid去找属于你的session,但不好意思,这时找不到了,因为超时后被干掉了。
      

  2.   

    可以加一个session监听器 查看session的回话变化。。
      

  3.   

    jessionId就是在第一次访问服务器的时候产生的,就是session回话的ID
      

  4.   


    关键是查看http请求,http头里就带有这个jessionId,没有服务器的应答,这个jessionId就出现了
      

  5.   


    关键是查看http请求,http头里就带有这个jessionId,没有服务器的应答,这个jessionId就出现了
    我的解释没看吗?你打开电脑,打开浏览器,发送请求,此时虽然没有建立session,但是浏览器会取cookie中得jessionid
      

  6.   


    关键是查看http请求,http头里就带有这个jessionId,没有服务器的应答,这个jessionId就出现了
    我的解释没看吗?你打开电脑,打开浏览器,发送请求,此时虽然没有建立session,但是浏览器会取cookie中得jessionid

    我明明清除了cookie,额···,好吧,估计是我的cookie没清除干净。你说我存在本地磁盘上的cookie中已经有了这个jessionId,那么我再登陆的时候服务器端我的session肯定是不存在的,这个时候是不是服务器端就要开辟空间,为我创建一个session啊?··服务器怎样去生成jessionId的啊?····怎样保证产生的这个jessionId没有被使用过?(是根据时间吗?···如果根据时间的话,那高并发的访问,也可能出现时间相同的情况啊··)这个jessionId是怎么维持不相同的?···
      

  7.   

    下面是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();
        }