Gwt 反向代理背后的SOP问题

Gwt 反向代理背后的SOP问题,gwt,reverse-proxy,same-origin-policy,Gwt,Reverse Proxy,Same Origin Policy,我花了5个月的时间开发了一个gwt应用程序,现在是第三方用户开始使用它的时候了。为了准备这一点,他们中的一个在反向代理后设置了我的应用程序,这立即导致浏览器的同源策略出现问题。我猜响应标题中有问题,但我似乎无法以任何方式重写它们来消除问题。我试过这个 response.setHeader("Server", request.getRemoteAddress()); 以某种天真的方式试图模仿我想要的行为。没用(没人惊讶) 任何了解这一点的人在读到这篇文章时都很可能会窃笑和摇头,我不怪他们。我也会

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

response.setHeader("Server", request.getRemoteAddress());
以某种天真的方式试图模仿我想要的行为。没用(没人惊讶)

任何了解这一点的人在读到这篇文章时都很可能会窃笑和摇头,我不怪他们。我也会窃笑,如果是我。。。我对此一无所知,这自然使这个问题很难解决。任何帮助都将不胜感激

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

编辑:我遇到的确切问题是一个弹出窗口说:

“SmartClient无法直接联系 统一资源定位地址 “多斯塔夫斯” 由于浏览器同源策略。 删除主机和端口号(偶数) 如果要避免此问题, 或者使用XJSONDataSource协议(该协议 允许跨站点调用),或使用 随附的服务器端HttpProxy 智能客户端服务器。“

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

解决方案
chris_l和saret都帮助我找到了解决方案,但由于我只能标记一个,所以我标记了chris_l的答案。鼓励读者将他们两个都标记出来,他们在这里真的为我找到了答案。解决方案非常简单,只需删除到服务器的任何绝对路径,只使用相对路径,这对我来说就成功了。谢谢大家!

你到底有什么问题

由于之前必须为GWT应用程序编写reverseproxy,我不记得遇到过任何SOP问题,但您需要做的一件事是确保将响应头和uri重写为reverseproxies url—这包括ajax回调url


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

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

似乎其他人也遇到过这种情况(特别是Michele Renda的回答)

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

因此,如果页面是
http://www.example.com/index.html
,您的AJAX请求还必须指向
http://www.example.com
。对于SOP,如果有反向代理,则无所谓,只要确保URL与浏览器显示的一致(包括端口和协议)-没有区别。您在内部使用的URL是不相关的-但不要在您的GWT应用程序中使用该内部URL


注意:在SmartClient的特殊情况下,解决方案是使用相对URL(而不是指向同一来源的绝对URL)。由于浏览器中没有SOP要求相对url,我认为这是SmartClient中的一个缺陷。

谢谢您的回答saret。我已经对我正在处理的确切问题进行了澄清,但我不认为这是一个序列化问题。有一件奇怪的事是,通过反向还原,您的url应该是“。。。,这意味着浏览器在尝试点击“”时不应给出SOP问题。GWT应用程序在什么时候会导致问题-此问题之前应用程序加载正常吗?此问题之前应用程序已加载。当我开始调用服务器时,就会出现这种情况……请尝试检查javascript/html中是否有任何url仍然指向应用程序()的实际url,而不是反向代理url。值得尝试的一件事是,如果可能,请尝试确保您的url是相对路径,因此您不应该真正需要使用GWT.getModuleBaseURL()谢谢你的回答。我一直在使用GWT.getModuleBaseURL(),这可能是问题所在吗?我对getModuleBaseURL()真的有点不确定。但我知道的是,配置应用服务器(您使用哪一个?)来了解代理通常是一个好主意——因此,每当您要求服务器提供URL时,它都会返回代理的公共URL。下面是如何在中执行此操作(请参见元素)。啊,谢谢。我正在运行Tomcat 6,我会立即尝试。不,这没有帮助。不过,感谢您的建议,我真的很感激。这不是SmartClient中的bug,只是您应该使用指向可公开访问的代理的绝对URL,而不是您的内部应用程序或本地主机。