session冲突问题产生的原因和解决方法:


背景知识
    1. cookie与session的关系
       cookie和session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,
       这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,
       因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用(注意:有些资料说ASP解决这个问题,当浏览器的cookie被禁掉,
       服务端的session任然可以正常使用,ASP我没试验过,但是对于网络上很多用php和jsp编写的网站,我发现禁掉cookie,网站的session都无法正常的访问)


问题现象

    项目A和项目B,部署在同一台服务器下,使用相同的域名,他们的访问方式类似于下面这样:
    http://test.domain.com/A/index.jsp
    http://test.domain.com/B/index.jsp


    A项目中有个链接到B项目的链接(用户名和密码放在参数里,到B项目中的方法中验证,组装user并设置到session里),
    当在A项目中点击了链接后会将B的页面内嵌在A系统中,再次点击A项目的其他菜单时退出到登录页面


问题原因
    经过检查,发现点击过B链接后,原来存储在session中的user对应没有了,再次点击A的其他菜单时因为找不到登录信息而被退回到登录页面。


    websphere 服务器默认产生sessionid为'JSESSIONID',当登录A系统时,服务器为A系统生成了SESSIONID=123的session信息存储到服务器,并把
    sessionId及其值存储到客户端cookie中,每次发起同域名的请求时就会把这个sessionid和值传递到服务器。
    当点击B链接时,由于B项目和A项目同域名,所以会传递SESSIONID=123到B项目容器,B项目所在容器发现SESSIONID=123并不存在,就新建了个SESSIONID=456
    并传递给客户端浏览器存入test.domain.com域名对应的cookie,此时原来在A项目产生的SESSIONID=123已经被覆盖成SESSIONID=456,所以当再次点击
    A项目的其他链接时会传递SESSIONID=456给A项目服务器,此时A项目服务器又变得不认识了,所以有新建了个session,回传给客户端保存在同名的COOKIE中,导致新的session里没有user对象信息
    而被退回到登录页面。


解决方法
    改变A或B所在web容器的session的ID名称(也即存储在客户端的cookie名称),如把B项目所在容器的session的ID名称改为SESSIONIDA (结尾多加个A)
    这样,两个项目即使有相互交叉session也不会冲突覆盖了,请求A项目和B项目都发送SESSIONID=123和SESSIONIDA=456两个cookie,各自用各自的sessionID名称取值  
    (经测试,当同域名不同sessionId时,第二次请求B时会为B单独生成cookie文件,从而区别于A生成的文件,当两个sessionId一致时始终是一个cookie文件,从而导致冲突
    当请求A项目是,服务器设置SESSIONID=123到客户端,当请求B项目时,服务器设置SESSIONID=456到客户端,分开存储,但是因为还是在同一域名下,所以此后请求A项目和B项目
    会把两个cookie都发送到服务器端,服务器端根据自己容器定义的SESSIONID名称取对应的cookie值,从而避免冲突)




    其他方法:也可通过改变cookie存储路径来实现。
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值