打开第一个网页,然后登录,用session保存用户名。然后点击登录后网页里一个链接,随后在网页中输出用户名(比如用户名为1,输出的就是1)
再打开一个网页,具体操作步骤如上,打印用户名(2个网页用不同的用户名和密码,假设用户名为2,然后输出2)但是在我在点击第一个网页中的链接时,问题就来了,它输出的也是2,我想问一下,我现在打开2个网页,应该是给servlet创建了2个线程,他们应该各自有个session的实例的,为什么第一个网页的session值会被覆盖呢?难道sessios在整个应用程序阶段,只被创建一次?并且也不是线程安全的吗?请各位大虾帮忙解释一下!谢谢了

解决方案 »

  1.   

    楼主的这个问题还不仅是Session的问题,还涉及到线程,我都还没有弄懂session的用法,等待大侠......................
      

  2.   

    这个问题好像在张志宇的视频里面有,具体的我也忘记了那个视频专门是讲Servlet 的。。
    你要是感兴趣的话,可以查哈里面讲的还算详细。。
      

  3.   

    按照规范,session是共享的。同一台机器、同一个浏览器进程、没过超时时间,session必须是同一个。即便session对象不是同一个(按照你的分析),session域也一定是同一个。不是这样的Servlet容器就过不了Java认证。
      

  4.   

    你的意思也就是说,session无论有多少个实例,在一个线程中使用setAttribute("1")后,在另外的线程中在使用setAttribute("2"),始终要覆盖掉以前的值是吗?
    哪如果是这样,session的作用域到底还什么用?
      

  5.   

    按照个人的理解,session是一个会话发生自动就由服务生成的。每一个会话都只是有一个session,关于这一点可以获取SESSION的ID来验证。在同一个浏览器,无论你打开多少个窗口,服务器都会认为是同一个程序发出的请求,所以共享同一个SESSION,如果你两个窗口都对存储在SESSEION中的同一个变量进行赋值,那么服务器会记录最新的那个,所以会有你刚才的情况发生。如果你用不同的浏览器同时访问同一个服务器,那么SESSION是不同的。如果楼主还不清楚,可以具体去了解一下会话与SESSION的一些机制。
      

  6.   

    晕,这个问题是Session的特征嘛,也就是同一套窗口只有一个Session,你往里面放同一个key的value值它当然要覆盖以前值了,当你重新启动另一套窗口,它用的就是另外一个Session了,一个Session的生命周期就是它本身的一套父子窗口的存在时间,如果整套窗口被关闭了,这个Session也就消失了,当然如果你长期不关闭这套窗口,服务器会在一个默认时间段后清除该Session释放内存
      

  7.   

    重复一遍,若两个请求(也就是两个线程)落在“同一台机器、同一个浏览器进程、没过超时时间”这个范围中,是同一个Session范围,当然要覆盖原值。
    对的。
      

  8.   

    session就是一个客户端一个,如果打开两个网页相当于在同一个客户端进行操作当然会覆盖掉这个session了
      

  9.   

    5楼正解,session在同一电脑,同一浏览器中共用一个session,如果你一直不关浏览器,半个小时后session会自动清空~!
      

  10.   

    一个session相当于一次会话,双击ie打开浏览器就是一次会话,在一次会话里所有的操作都是共享一个session的
      

  11.   

    session保存在服务端内存中,每个session都有唯一的sessionId
    sessionId保存在cookies里
    当客户端发起请求的时候,会将客户端cookies中保存的sessionId发送都服务端
    服务端根据客户端发送过来的sessionId寻找session,如果session存在则取相应的session,不存在则创建
    lz用的是同个浏览器,取同个cookies,sessionId相同,所以两次请求都是取到同一个session
      

  12.   

    LS正解,你第一登陆时,server创建了一个新的session,并在response中加入了seesionid的cooike,当你第二次登陆时,实际上这时server是没有新创建session的,使用原来那个,但这时你把用户名给覆盖了...如果你配置session监听器的就会发现,在你的这几次操作中server自始至终中建了一次session
      

  13.   

    session是同个用户共享的,应该是一样的数据吧
      

  14.   

    把那个用户信息在servlet中设置成局部的。另外必要时加上Synchronize语句块。