寻找某人来证实或反驳我的理论,即部署两个 iframe 指向同一域上的两个不同的有状态页面会导致 JSESSIONID 被覆盖。这就是我的意思:
设置
- 假设您有两个页面需要 HttpSession 状态(会话亲和性)才能正常运行 - 部署在http://www.foo.com/ page1 和http://www.foo.com/ page2
- 假设 www.foo.com 是运行 Tomcat(6.0.20,fwiw)的单个主机,该主机使用 JSESSIONID 作为会话 ID。
- 假设这些页面变成了两个 iframe 小部件嵌入到第 3 方网站:http://www.site.com/page1" />(和 /page2 分别)
- 假设有一个第三方网站希望将两个小部件放在同一页面上http://www。bar.com /foowidgets.html
是否会发生以下竞态条件?
- 一位新访客访问http://www.bar.com/foowidgets.html
- 浏览器开始加载 foowidgets.html 中的 URL,包括两个 iframe 'src' URL
- 因为浏览器针对同一主机打开多个并发连接(在 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)。富吧!
上述情况会发生吗?我想是的,但希望得到确认。
如果上述显然是可能的,考虑到我们希望每页支持多个 iframe,有哪些解决方案?我们并不迫切需要 iframe 共享相同的 HttpSession,尽管这样会很好。如果解决方案仍会为每个 iframe 规定一个单独的 HttpSession,那么 iframe 1 最终不会引用 iframe 2 的 httpSession 状态而不是自己的状态是强制性的。
在我的脑海中,我能想到:
- 将 page1 和 page2 映射到不同的域(操作开销)
- 使用 URL 重写,从不使用 cookie(搞乱分析)
- 还要别的吗?
非常感谢,-尼基塔