服务器与浏览器无状态的,当浏览器想服务器请求时,第一次会得到一个 SessionID, 并记录在客户端 Cookie 里面。    当然没有开启 Cookie 时会通过 Url 等其他方式;没有使用 Session 时,这个 SessionID 也会不断变化,随便写一点东西到 Session 中就会固定下来。我的疑惑是:1、打开一个浏览器窗口,得到一个唯一的 SessionID。    -- 这个没有问题
2、同一浏览器窗口,多开一个标签(IE7、TT 等很多浏览器都有这个功能), SessionID 不变。      -- 疑惑:服务器咋知道是新开的窗口还是新开的标签呢?
3、新开一个浏览器,依然访问统一服务器 Url,SessionID 就变了。                              -- 疑惑:看来服务器的确知道是新开的窗口还是新开的标签。
难道客户端浏览器还会告诉服务器,我是新开的标签还是新开的窗口吗?

解决方案 »

  1.   

    SessionID是服务器生成,并发放给客户端的。下次访问的时候,由浏览器负责将该Session信息附加在header里面发给服务器。因此除了因为1)过期2)invalidate()3)服务重启等原因导致session失效外,浏览器有一定的自由来选择session生效的策略。之前有人比较过ie和netscape,发现
    IE中:
      有效的窗品包括
      1.Session对象只在建立Session对象的窗口中有效。
      2.在建立Session对象的窗口中新开链接的窗口
      
      无效的窗口包括
      1.直接启动IE浏览器的窗口
      2.不是在建立Session对象的窗口中新开链接的窗口NetScape中:
      只要一个窗口有了某个Session对象,则全部窗口对此Session都有效在最新的ie8和google chrome中,由于每个Tab都是一个进程,因此策略又不尽相同了。
      

  2.   

    浏览器负责将该 SessionID 附加在 header 里面发给服务器,这个我知道。-------------哦,我明白了。  附加不附加,是由客户端浏览器决定的,目前 IE7 新开的 Tab 它就附加,新开的窗口就不附加。
      

  3.   

    简单的说,目前多标签浏览器 都是单进程,所以公用一个session . 你新开进程 则会获得新的session
      

  4.   

    保存SessionID的Cookie是临时的,浏览器关闭就失效,也就是说这个Cookie只对一个浏览器有效。