我花了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的答案。我们鼓励读者把它们都搞砸,他们真的在这里找到了我。解决方案非常简单,只需删除服务器的任何绝对路径并仅使用相对路径,这对我来说就是一个诀窍。谢谢你们!
答案 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中的一个错误。