在网站群的建设中,各子站须要共享主站的footer等公共信息。同时主站的后台管理也集成了各子站的管理,采起的方式是使用iframe嵌入各站的页面。在本机开发环境中,没有出现任何的问题。可是一放到测试环境中,便遇到session丢失的问题。
环境:应用服务器采用tomcat6.0,各个站点单独使用一个应用服务器,部署在一台物理服务器上。外部访问采用同一个IP,可是不一样的端口。
起初觉得,IE它的安全策略默认是会把iframe中的页面站点认为是不可信任的,它会阻止该站点传过来的cookie(若是你在iframe中的URL跳转是用的localhost,则不会被阻挡),因此由于无法使用cookie了,session便失效了。解决的方法是在过滤器,或者被嵌入的页面内加入属性为P3P的header信息。java为:response.addHeader("P3P","CP=CAO PSA OUR");可是依然没有成功。网上的解决方案都是这么说,何况本身之前还弄过,都成功过,此次怎么弄都很差。
今天脑子安静下来,仔细的分析这里面的缘由。若是是IE的安全限制,可是火狐、google浏览器没有这样的限制,为何这两个浏览器也出现这样的状况。这确定不单单和跨域引发的P3P的安全问题有关。因而在本机测试,经过iframe引入测试环境中的连接,设置了P3P,发现一切正常。这就更说明了,测试环境中的问题绝对不是P3P的问题了。并且使用了同一个IP,也应该没有跨域的说法。那缘由究竟是什么呢?
慢慢的,我将视线注意到了端口上。这些网站的访问方式都是:同一IP+不一样端口,难道和端口有关系。上网搜,关于这方面的内容太少了,可是总算在零星的资源中,找到了里面的缘由。IP相同的两个session对应的cookie是同样的,而不幸的是sessionID就保存在cookie中,这样先访问A,再访问B的时候,B的sessionid会覆盖A的sessionid。这个事情没办法解决,因此你不要搞两个端口,最好是搞两个IP。原来都是cookie惹的祸,它不会区分端口,形成这多个站点不断的后来的覆盖前面的,从而形成session的丢失。问题解决了,将相互有引用的应用架构在不一样的虚拟主机中,或者映射不一样的IP。java