【发布时间】:2012-02-08 11:20:14
【问题描述】:
如何编写 jquery ajax() 调用(例如 xmlhttprequest)以保留会话 ID(例如发送浏览器 cookie 中已有的“jsessionID”cookie)
我们的背景:
- 两个基于 Java 的 Web 应用程序
- SSO 机制将用户记录到两个应用程序中(即,与应用程序 A 的会话 101 和与应用程序 B 的会话 202)
- 应用程序“A”使用 javascript (jquery) 对应用程序 B 进行休息调用
- 应用程序 B 在 Java jersey (fwiw) 中实现了 REST API
- 从应用程序 A 到 B 的所有 GET 和“老式表单 POSTS”都连接到“会话 B”上的同一会话 #202
- XmlHttpRequests(例如 jquery 'ajax()' 调用)不重用会话 #202。每个 XmlHttpRequest 都会获得一个新会话
为什么要新建会话?
原因:XmlHttpRequest 没有向应用程序 B 传递任何 cookie。Servlet 容器在 cookie 中设置了 jsessionid。服务器没有得到jsessionid
相比之下,JSONP 调用(动态生成
问题
- 获取 ajax xmlhttprequest 调用以将会话 id (cookies) 传递给目标应用程序的最简单方法是什么?
- 关于 ajax、cookie、xmlhttprequest 和 REST 的任何好的参考资料?
- 谁能推荐阅读 REST API 设计和身份验证?
Web 会话、状态和身份验证
我知道 REST 应该是无状态的,并且重用 Web 会话似乎有些脆弱(即与使用 OAuth 和身份验证令牌相反,netflix 也是如此)
这是第一次迭代,我们已经接近“启动并运行”。这适用于 JSONP,但 XmlHttpRequest 发布失败。
提前致谢
更新:
确实是一个幼稚的问题。
事实证明,通过 xmlhttprequest/ajax 进行跨站点发布存在固有的安全问题和变通方法。例如,Firefox 不会使用 XmlHttpRequest 传递 cookie,除非您添加特殊的标头。然后,Firefox 将对服务器进行“飞行前检查”(即 http OPTIONS 调用)以查看“这可以吗?”。您的服务器需要在 Firefox 执行您的“使用 cookie 的帖子”之前回答“OPTIONS”调用说“是的,这没关系”。
IE 和 Firefox 以不同的方式解决这些问题(即有点像 1998 年左右的 javascript)。我不知道 IE 做了什么,但经历了 1998 年,如果可能的话,我们不想真正走这条路。
我们编写了一个解决方法。
当我们开始编码时,我们的团队中没有一个人知道这一点。 (即“jsonp 在原型中工作得很好;其他一切也应该”)
参考资料: Mozilla 如何解决这个问题(http 标头和预检检查) https://developer.mozilla.org/En/HTTP_access_control
跨域资源共享: http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing
【问题讨论】:
-
您能描述一下您提到的解决方法吗?
-
我们将 sso 身份验证令牌作为请求参数传递,并修改服务器端以检查此参数。它闻起来有点骇人听闻,但始终如一且直截了当。我们确实没有尝试将tomcat的jsessionId作为参数传递,因为那是行不通的。
-
@user331465:我正要建议你自己的解决方法:) 很高兴我通读了。您应该发布您的
update作为答案。
标签: jquery ajax session rest xmlhttprequest