常常会遇到,iframe跨域时,另一个系统读不到第一个系统的session。或者有时能读到,有时session却莫名奇妙的丢失问题。
或者frameset里面几个frame的sessionid不同,用下面的方法可以解决
frameset页面改扩展名为asp?
下面,我们就这一问题做简要的分析并提出可行的解决方案
假定系统一中一个iframe,包含了系统二的东西。而系统一用户在此iframe加载后还会不定时的再请求系统二,而这第二次请求,往往会发生读不到第一次的请求的session问题。
经过分析两个系统的sessionId情况后发现,其实所谓的session丢失问题并不是真的存在,第二个系统在读到iframe的src请求后,会把这个session存下来,这时不管什么情况,session是正确的。而当用户继续在第一个系统页面上操作,下一次访问系统2时,就会出现所谓的session丢失问题,即读不到前面第一次请求时系统2保存的session值。
我测试的系统1是jsp+tomcat。系统2是asp+iis.
通过比较asp对两次请求响应的sessionId发现。第二次请求时,sessionId比第一次iframe请求时的sessionId大1,也就是说,第二次请求时,系统2读了新的session值,而不是第一次请求时的session值。
现在,问题已经很明了,就是说,asp服务端把第二次请求当成了一次新的请求。所以,解决这个问题的突破口就在与,我们需要告诉系统二,不要把iframe请求后的后续请求当做新的请求。而是用iframe第一次请求的session。
解决方案:
如果你的系统二是IIS上的(Asp)系统。在IIS上做如下设置:
1.打开IIS
2.选择被嵌入iframe源站点或者目录,右键点击打开属性框
3.切换到HTTP头-->添加
5.自定义HTTP头名: P3P
6.自定义HTTP头值: CP="CAO PSA OUR"
7.关闭属性框退出,即刻生效
上面的设置含义是告诉IIS,不要画蛇添足把我的第二次请求当做新请求了,你就用老的session好了。
如果你的第二个系统是jsp的。那么
1.可以在你包含的jsp页面头部加上 response.addHeader("P3P ", "CP=\"CAO PSA OUR\""),这个方法比较笨,页面多的话要一个一个加,肯定不好
2.在你的web服务器的配置文件上找到httpheader的配置,也加上P3P-->CP="CAO PSA OUR" 这对值 即可。如tomcat的 service.xml文件
至此,问题解决!
说明:iis上的设置本人测试过,没有问题。而jsp系统,我虽没测试,但是可以以此类推,在web服务器上配置。可以搜索"Tomcat Httpheader 配置方法"找到配置步骤,配上P3P-->CP="CAO PSA OUR" 这对值即可