Nik*_*ita
6
cookies
tomcat
url-rewriting
jsessionid
寻找某人确认或反驳我的理论,即在同一域上部署指向两个不同有状态页面的两个iframe可能导致JSESSIONID被覆盖.这就是我的意思:
建立
- 假设您有两个页面需要HttpSession状态(会话亲和性)才能正常运行 - 部署在http://www.foo.com/ page1
和http://www.foo.com/ page2
- 假设www.foo.com是运行Tomcat(6.0.20,fwiw)的单个主机,它使用JSESSIONID作为会话ID.
- 假设这些页面被转换为嵌入第三方网站的两个iframe小部件:http://www.site.com/page1"/>(和/ page2分别)
- 假设有第三方网站希望将两个小部件放在http:// www.bar.com /foowidgets.html
可能出现以下竞争条件吗?
- 一位新访问者访问http://www.bar.com/foowidgets.html
- 浏览器开始在foowidgets.html中加载网址,包括两个iframe的'src'网址
- 因为浏览器针对同一主机打开了多个并发连接(在chrome/ff情况下高达6个),浏览器碰巧同时发出了对http://www.foo.com/page1和
http://www.foo.com的请求/第2页
- tomcat @ foo.com几乎同时收到两个请求,第一次调用getSession()(在两个不同的线程上)并懒惰地创建两个HttpSession,因此创建两个JSESSIONID,值为$ Page1和$ Page2.请求还将数据填充到各个会话中(将需要数据来处理后续请求)
- 假设浏览器首先收到对page1请求的响应.浏览器为HOST www.foo.com设置cookie JSESSIONID = $ Page1
- 接收到对page2请求的下一个响应,并且浏览器
使用$ Page2 覆盖 HOST www.foo.com的cookie JSESSIONID
- 用户点击foowidgets.html上'page1'iframe中的内容; 浏览器向http://www.foo.com/page1?action=doSomethingStateful发出第二个请求
.该请求带有JSESSIONID = $ Page2(而不是$ Page1 - 因为cookie值被覆盖)
- 当foo.com收到此请求时,它会查找错误的HttpSession实例(因为JSESSIONID键是$ Page2而不是$ Page1).Foobar的!
以上可以发生吗?我是这么认为的,但我希望得到确认.
如果以上显然是可行的,那么我们想要支持每页多个iframe的解决方案是什么?我们并不需要iframe共享相同的HttpSession,尽管这样会很好.如果解决方案仍然会为每个iframe规定一个单独的HttpSession,那么当然 - iframe 1最终不会引用iframe 2的httpSession状态而不是iframe.
我能想到的是:
- 将page1和page2映射到不同的域(操作开销)
- 使用URL重写而不是cookie(搞乱分析)
- 还要别的吗?
非常感谢,-nikita