使用 jquery 在 ajax xmlhttprequest 上重新使用 jsessionId
我如何编写 jquery ajax() 调用(例如 xmlhttprequest)来保留会话 ID(例如发送浏览器 cookie 中已有的“jsessionID”cookie)
我们的上下文:
- 两个基于 java 的 Web 应用程序
- SSO 机制将用户登录到两个应用程序(即与应用程序 A 进行会话 101,与应用程序 B 进行会话 202)
- 应用程序“A”使用 javascript (jquery) 对应用程序 B 进行休息调用
- 应用程序 B 在 Java 中实现休息 API jersey (fwiw)
- 从应用程序 A 到 B 的所有 GET 和“老式表单 POSTS”都连接到“会话 B”
- XmlHttpRequests 上的同一会话 #202(例如 jquery 'ajax()' 调用)不重复使用会话 #202 。每个 XmlHttpRequest 都会获得一个新会话
为什么是新会话?
原因:XmlHttpRequest 没有将任何 cookie 传递给应用程序 B。Servlet 容器在 cookie 中设置 jsessionid。服务器未获取 jsessionid
相反,JSONP 调用(动态生成
问题
- 获取 ajax xmlhttprequest 调用以将会话 ID (cookie) 传递给目标应用程序的最简单方法是什么?
- 关于 ajax、cookie、xmlhttprequest 和 REST 有什么好的参考吗?
- 有人可以推荐阅读 REST API 设计和身份验证吗?
Web 会话、状态和身份验证
我知道 REST 应该是无状态的,并且重新使用 Web 会话似乎有些脆弱(即与使用 OAuth 和身份验证令牌相反,如 netflix)
。第一次迭代,我们就快要“启动并运行”了。这对于 JSONP 来说工作得很好,但是 XmlHttpRequest 发布失败了。
提前致谢
更新:
确实是一个天真的问题。
事实证明,通过 xmlhttprequest/ajax 进行跨站点发布存在固有的安全问题和解决方法。例如,Firefox 不会通过 XmlHttpRequest 传递 cookie,除非您添加特殊标头。然后,Firefox 将对服务器进行“飞行前检查”(即 http OPTIONS 调用)以查看“这样可以吗?”。在 Firefox 执行您的“使用 cookies 发布”之前,您的服务器需要回答“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
How can I code a jquery ajax() call (e.g. xmlhttprequest) to preserve the session ID (e.g. send the 'jsessionID' cookie already in the browser's cookies)
Our context:
- Two java based web applications
- SSO mechanism logs User into both applications (i.e. has session 101 with application A and session 202 with application B)
- Application "A" uses javascript (jquery) to make rest calls to the Application B
- Application B implemented rest API in Java jersey (fwiw)
- All GET's and "old-school form POSTS" from Application A to B connect to the same session #202 on "session B"
- XmlHttpRequests (e.g. jquery 'ajax()' calls) do not re-use session #202. Each XmlHttpRequest get a new session
Why New Sessions?
The reason: XmlHttpRequest do not pass any cookies to application B. Servlet container sets jsessionid in the cookie. Server does not get the jsessionid
In contrast, JSONP calls (which dynamically generate <script src="http://server/b/page.x">) do pass the cookies.
The questions
- What's the easiest way to get ajax xmlhttprequest calls to pass session id (cookies) to the target application ?
- Any good references on ajax, cookie, xmlhttprequest, and REST?
- Can anyone recommend reading on REST API design and authentication?
Web Sessions, State, and Authentication
I know REST is supposed to be stateless, and re-using web sessions seems somewhat fragile (i.e. as opposed to using OAuth and authentication tokens, as does netflix)
This is the first iteration and we were close to getting things "up and running". This worked fine with JSONP, but XmlHttpRequest posts failed.
thanks in advance
Update:
A naive question indeed.
It turns out that cross-site posting via xmlhttprequest/ajax has inherent security issues and workarounds. Firefox, for example, will not pass cookies with XmlHttpRequest unless you add special headers. Firefox will then do a 'pre-flight check' (i.e. an http OPTIONS call) to the server to see "is this ok?". Your server needs to answer the "OPTIONS" call saying "yes it's ok" before firefox will perform your "post with cookies".
IE and Firefox solve these problem differently (i.e. a bit like javascript circa 1998). I don't konw what IE does, but having lived through 1998, we don't want to really go down that road if at all possible.
We coded a workaround.
None of our team knew this when we started coding. (i.e. "jsonp worked great in the prototype; everything else should also")
References:
How Mozilla addresses this problem (http headers and preflight checks)
https://developer.mozilla.org/En/HTTP_access_control
Cross Origin Resource Sharing:
http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您还可以通过部署有状态代理来解决此问题。它们必须安装在这两个应用程序上。然后,您可以通过代理进行所有基于会话的调用,并将远程会话数据存储到本地代理的会话中。
You could also solve this problem by deploying a state-ful proxy. They'd have to be installed on both apps. You'd then make a all your session-based calls thru the proxy and store the remote session data into your local proxy's session.