您的位置:首页 > 其它

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

2016-06-03 17:36 288 查看
背景知识

    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存储路径来实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: