反向代理背后的SOP问题

时间:2010-08-17 13:30:00

标签: gwt reverse-proxy same-origin-policy

我花了5个月的时间开发gwt应用程序,现在它已成为第三方人开始使用它的时候了。为了准备这一点,他们中的一个人在反向代理后面设置了我的应用程序,这立即导致浏览器的相同原始策略出现问题。我想响应标题中存在问题,但我似乎无法以任何方式重写它们以使问题消失。我试过这个

response.setHeader("Server", request.getRemoteAddress());

以某种天真的方式模仿我想要的行为。没有工作(令没有人惊讶)。

任何了解这一点的人都会在阅读本文时嗤之以鼻,并且我不会责怪他们。我也会窃笑,如果是我......我对此一无所知,这自然会让这个问题难以解决。任何帮助都将非常感激。

如何让标题重写工作并摆脱我正在处理的SOP问题?

修改:我遇到的确切问题是弹出式提示:

  

“SmartClient无法直接联系   网址   'https://localhost/app/resource?action=' doStuffs'”   由于浏览器同源政策。   删除主机和端口号(甚至   如果localhost)避免这个问题,   或使用XJSONDataSource协议(其中   允许跨站点调用),或使用   包含服务器端的HttpProxy   SmartClient服务器。“

但是我不需要smartclient HttpProxy,因为我在服务器上有一个代理,我应该吗?我没有迹象表明这可能是一个序列化问题,但也许这条消息隐藏了真正的问题......

解决方案 chris_l和saret都帮助找到了解决方案,但由于我只能标记一个,我标记了chris_l的答案。我们鼓励读者把它们都搞砸,他们真的在这里找到了我。解决方案非常简单,只需删除服务器的任何绝对路径并仅使用相对路径,这对我来说就是一个诀窍。谢谢你们!

2 个答案:

答案 0 :(得分:2)

你到底有什么问题?

以前不得不为GWT应用程序编写reverseeproxy我不记得遇到任何SOP问题,但你需要做的一件事是确保响应头和uri被重写为reverseproxies url - 这包括ajax回调url


在reverseeproxy后面运行时遇到的一个问题(您可能也会遇到)是GWT服务器的序列化策略。

修复此问题需要编写RemoteServiceServlet的实现。虽然这是在2009年初/中期,但似乎问题仍然存在。

似乎其他人也是如此 - see this for further details(特别是Michele Renda的回答)

答案 1 :(得分:2)

当HTML页面的URL和AJAX请求的URL在“origin”中不同时,SOP(对于AJAX请求)适用。起源包括主机,端口和协议。

因此,如果页面为http://www.example.com/index.html,则您的AJAX请求也必须指向http://www.example.com下的内容。对于SOP来说,如果有一个反向代理也没关系 - 只要确保,浏览器中显示的URL(包括端口和协议)并没有什么不同。您在内部使用的URL无关紧要 - 但不要在GWT应用程序中使用该内部URL!

注意: SmartClient特殊情况下的解决方案原来是使用相对URL(而不是相同来源的绝对URL)。由于相对URL不是浏览器中的SOP要求,我会说这是SmartClient中的一个错误。