1、A机 和 B机 做了集群(Tomcat的) [两台不同的物理电脑,1笔记本,1台台式机,两个电脑用心跳方式连接]
  2、用A机,IE浏览器,访问叶面 http://localhost/setServer.jsp
  3、A机,Tomcat控制台打印出了"Say:Server.Jsp"
  4、关闭A机Tomcat!
  5、用B机,IE浏览器,访问页面 http://localhost/getServer.jsp
  6、A机,Tomcat控制台打印出了"Say:Form Server A"
  setServer.jsp
<%
System.out.println("Say:Server.Jsp");
session.setAttribute("getValue","Say:Form Server A");
%>
 getServer.jsp
<%
System.out.println(session.getAttribute("getValue"));
%>这是我的测试结果:可是我不明白根据我看的文档资料
类似我这样写的session保持,是要借助浏览器的会话cookie的,也就是说如果浏览器关闭以后,服务器session虽然
没有消失。但是由于浏览器cookie消失了,所以无法让浏览器和服务器早交互了!但是我这个现象要怎么解释啊?

解决方案 »

  1.   

    集群有很多种的,有apache+n个tomcat集群你把a机tomcat关闭的时候,session已经复制到b机器里了。
      

  2.   

    其实tomcat集群的时候,你 http://localhost/setServer.jsp 访问的也不一定就是a机器(如果你两个机器工程都有这两个页面的话),虽然你用a机器访问的。
      

  3.   

    tomcat的集群方式是session复制,
    配上以后它周期同步两台机器所有的session对象。所以就出问题了?这种集群方式在流量大的时候就死定了。
      

  4.   

    我没看到你关闭浏览器的步骤所以你下次访问时,浏览器根本不是到tomcat已经切换了,因为http是无状态的
      

  5.   

    其实tomcat集群的时候,你 http://localhost/setServer.jsp 访问的也不一定就是a机器(如果你两个机器工程都有这两个页面的话),虽然你用a机器访问的。 
    我的问题不在这里!我的问题是:session的机制是跟浏览器cookie有关的!(cookie有两种一种是,浏览器的会话cookie在内存。一种是物理文件cookie在硬盘)http是无状态协议
    为了能和用户保持交互。在浏览器和服务器有一个互相的认知!session就是利用浏览器cookie来实现的!
    但是我已经在A机上关闭了浏览器。所以A机器的浏览器cookie应该消失了!
    但是我在b机直接session.getA...竟然可以得到我在A机器设置的数值!
    因为每一个用户都有独立的session所以我session.getA...的时候应该把我的浏览器上的sessionID发给了服务器
    然后服务器根据这个id去找这个session SET进去的数值!可是我B机器没有这个id怎么竟然得到了a机设置进去的数值的啊
      

  6.   

    to java2000_net 
    我没看到你关闭浏览器的步骤 
    ---------------------
    我是没有关闭A机的浏览器!但是这跟A机浏览器已经没有关系了啊。我去了b机的ie访问这个页面。跟a机的ie有什么关系啊
    我在重复一下我的步骤啊
      1、A机 和 B机 做了集群(Tomcat的) [两台不同的物理电脑,1笔记本,1台台式机,两个电脑用心跳方式连接]
      2、分别启动A机 , B机的Tomcat.两机Tomcat控制台提示信息表示。两机集群没有问题! 
      3、用A机,IE浏览器,访问叶面 http://localhost/setServer.jsp 
      4、A机,Tomcat控制台打印出了"Say:Server.Jsp" 
      5、关闭A机Tomcat! 
      6、用B机,IE浏览器,访问页面 http://localhost/getServer.jsp 
      7、B机,Tomcat控制台打印出了"Say:Form Server A" setServer.jsp 
    <% 
    System.out.println("Say:Server.Jsp"); 
    session.setAttribute("getValue","Say:Form Server A"); 
    %> 
     getServer.jsp 
    <% 
    System.out.println(session.getAttribute("getValue")); 
    %> 
      

  7.   

    session 是IE用户与服务器的一个会话状态,
    如果IE不是当前会话的那么服务器就会重新给你建一个会话,
    也就是说如果你的当前IE窗口不是之前会话的窗口或它的子窗口,那么服务器就认为它是一个新的会话,
    它无法确定你是之前的哪个会话,除非自己写程序来保持会庆,也就是sessionId,不过不同的服务大有不同的session的传递方式.
      

  8.   

    用了集群后A机关闭后,
    集群工具会把A机的session复制到B机服务器上,
    当客户访问的时候就人自动转到B机,
    这和客户端是没有关系的,
    有关系的时当前客户端是否在之前存在会话,如果没有因为A机已经关闭所以集群工具只能将访问转到B机,在B机新建一个会话。
      

  9.   

    我现在不知道你想测什么?既然你用集群那么你两台服务器的代码都应该是相同的,
    所以我们推理一下,
    2、用A机,IE浏览器,访问叶面 http://localhost/setServer.jsp 
    就会在服务器建立一个会话,
    3、A机,Tomcat控制台打印出了"Say:Server.Jsp"
    说明集群转向的是A机,  5、用B机,IE浏览器,访问页面 http://localhost/getServer.jsp 
    也会和上面打印的相同,
    6、A机,Tomcat控制台打印出了"Say:Form Server A" 这里不明白,在第4点不是4、关闭A机Tomcat! 
    怎么还能打印.....所以是不是还没什么没说,还是本人偶笨没理解您的话....  
      

  10.   

    补充一点
      5、用B机,IE浏览器,访问页面 http://localhost/getServer.jsp  
    是新建立会话,出不是A机上的会话
      

  11.   

    我倒是明白,lz的意思,你能不能,用ip地址,试试阿,群集的东西,外部看来,应该是同一个ip才对吧,不过,现在的结果是有点怪
      

  12.   

    楼主说的跟cookie相关的是不是另外一种集群方式?通过cookie有单独的session管理软件,具体的就不清楚了,刚接触叫什么名 忘了
      

  13.   

    我感觉现象和问题不是一回事先不说集群,你的set和get在正常情况下,即只有一台服务器,全部在A机操作,分别开两个IE(不是Ctrl+N),一个set,一个get也不会出现你这样的现象。所以你试试一台机器也出现这样的现象,那么这里的代码是有问题的,需要改进。因为session只是表示当前会话,两个IE就不是同一个会话了。只有在一台机器上测试成功了,然后你关闭A的tomcat,继续在A的机器上,同一个IE下测试才能测试集群是否session复制,当然,最好不要直接访问localhost,前面再加一个转向。