使用jquery在ajax xmlhttprequest上重用jsessionId

时间:2012-01-12 05:23:01

标签: jquery ajax session rest xmlhttprequest

如何编写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不会将任何cookie传递给应用程序B. Servlet容器在cookie中设置jsessionid。服务器没有得到jsessionid

相比之下,JSONP调用(动态生成< script src =“http://server/b/page.x”>)执行传递cookie。

问题

  • 获取ajax xmlhttprequest调用以将会话ID(cookie)传递给目标应用程序的最简单方法是什么?
  • 关于ajax,cookie,xmlhttprequest和REST的任何好的引用?
  • 任何人都可以推荐阅读REST API设计和身份验证吗?

网络会话,状态和身份验证

我知道REST应该是无状态的,重新使用网络会话似乎有点脆弱(即与使用OAuth和身份验证令牌相反,netflix也是如此)

这是第一次迭代,我们接近让事情“正常运行”。这适用于JSONP,但XmlHttpRequest发布失败。

提前致谢

更新

确实是一个天真的问题。

事实证明,通过xmlhttprequest / ajax进行跨站点发布存在固有的安全问题和解决方法。例如,Firefox除非添加特殊标头,否则不会使用XmlHttpRequest传递cookie。然后,Firefox将对服务器进行“飞行前检查”(即http OPTIONS调用)以查看“这样可以吗?”。你的服务器需要回答“OPTIONS”调用,说“是的没关系”,之后firefox将执行你的“使用cookies发布”。

IE和Firefox以不同的方式解决这些问题(即有点像javascript大约1998年)。我不知道IE会做什么,但是经历了1998年,我们不想真的走这条路,如果可能的话。

我们编写了一个解决方法。

当我们开始编码时,我们的团队都不知道这一点。 (即“jsonp在原型中工作得很好;其他一切也应该”)

参考文献: Mozilla如何解决这个问题(http标头和预检检查) https://developer.mozilla.org/En/HTTP_access_control

跨源资源共享: http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

1 个答案:

答案 0 :(得分:1)

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