【问题标题】:Re-using jsessionId on ajax xmlhttprequest using jquery使用 jquery 在 ajax xmlhttprequest 上重新使用 jsessionId
【发布时间】: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


【解决方案1】:

您还可以通过部署有状态代理来解决此问题。它们必须安装在两个应用程序上。然后,您将通过代理进行所有基于会话的调用,并将远程会话数据存储到本地代理的会话中。

【讨论】:

  • 有趣且有用的想法。您能否指出一个开源的有状态代理。另外,澄清一下,你的意思是“所有应用程序 http 调用都将通过这个有状态的代理”,除了“静态的东西”,即 css/gif/jpg 等。
  • 是的,您对其他应用程序的 http 调用将通过此代理。您的代理将使用某种 curl 协议编写。
  • stackoverflow.com/questions/5731815/… 是一个很好的参考。另请查看 php curl 参考资料php.net/manual/en/function.curl-setopt.php。您基本上需要编写一个保存 cookie 的代理。我看看能不能找到我之前写的代理的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2011-09-06
  • 1970-01-01
  • 2014-01-11
相关资源
最近更新 更多