Yur*_*nyy 7 subdomain gwt xmlhttprequest gwt-rpc same-origin-policy
我的问题是在通过子域访问页面时使用GWT 2.6.1时发生臭名昭着的"StatusCodeException:0"问题.https://sub.site.com/
现在,这种情况相当零星的一个客户使用IE11和我不能重现使用IE11,IE10,IE9还是IE8(不谈论Chrome或Firefox)几个不同的计算机上这一点.
从中访问完全相同的webapp https://site.com/似乎对该客户起作用.
这显然让我得出结论,我在同源策略方面遇到了问题.
但奇怪的是,我的webapp的设计方式是没有跨域或跨子域请求.这同样适用于无交叉协议以及无交叉端口的请求.换句话说,在这种情况下不违反同源政策.作为对此的确认,我可以提供以下证据:
在客户现场我已经看到了如何重现:客户开始使用应用程序,一切正常 - 所有请求都正常返回响应.然后,经过几分钟的工作,同一页面上的完全相同的请求(没有重新加载)开始失败,并显示StatusCodeException:0.
基本上,无论是https://sub.site.com和https://site.com指向同一个IP,并有只有一个Tomcat的web应用程序正是服务于相同的资源两个https://sub.site.com和https://site.com.
另一个证明是单个GWT模块本身的代码库:在那里我只使用一个服务的一个实例DashboardService:
public class DashboardModule extends EntryPoint implements IDashboardModule {
private final DashboardServiceAsync dashboardService = createDashboardService();
@Override
public void onModuleLoad() {
// loading of module elements
// dashboardService is passed as a parameter so only one instance is used
}
/**
* PLEASE SEE QUESTION #1 BELOW CODE SNIPPET
*/
private static final String DASHBOARD_REQUEST_URL = "request";
private static DashboardServiceAsync createDashboardService() {
final DashboardServiceAsync service = GWT.create(DashboardService.class);
((ServiceDefTarget) service).setServiceEntryPoint(DASHBOARD_REQUEST_URL);
return service;
}
}
Run Code Online (Sandbox Code Playgroud)
===================================编辑============== ======================
在客户位置查看控制台后,错误始终如下:
SCRIPT7002:XmlHttpRequest:网络错误0x2ee4,...
所以它似乎与同源策略无关,因为根据本文的描述,它被描述为ERROR_INTERNET_INTERNAL_ERROR An internal error has occurred.
很遗憾,但是我发现只有2个提到这个错误没有解决: IE10 下的错误和IE11 下的错误.
我假设客户很可能通过某些代理访问网站,稍微改变了请求,IE无法处理它们.
问题1:有人知道如何在本地模拟或重现上述错误?
问题2:有人知道如何优雅地解决这个问题吗?
问题3:可以简单地重试请求,或者此请求可能已到达服务器并进行修改,因此重试它可能会产生重复修改?
将尝试设置转发代理来模拟可能的客户设置,以至少重现上述错误...
我非常感谢任何帮助!
好吧,所以在经历了这个工作周的问题之后我终于设法解决了.
实际上,当我在Tomcat前面安装Apache2服务器并使用IE11从另一个VirtualBox Win7主机访问它时,我能够在本地重现非常类似的问题.这给了我零星StatusCodeException: 0有Network error 0x2ef3虽然但行为非常相似:GWT-RPC请求开始一分钟左右后失败.这在IE10和IE11中是可重现的,但在IE8和IE9中运行良好:)(IE在新版本中变得更加糟糕吗?)
本地我Keep-alive通过向/etc/apache2/sites-enabled/default-ssl.confApache2 ssl配置文件添加以下行来简单地禁用IE浏览器的功能,从而解决了这个问题:
# following line was added
BrowserMatch "Trident" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
</VirtualHost>
</IfModule>
Run Code Online (Sandbox Code Playgroud)
这基本上告诉Apache2不要使用keep-alive,使用特殊的 SSL处理,并且通常user-agent在请求中的字符串有Trident字时降级到HTTP 1.0标准(匹配IE11和IE10以及可能更早的IE)
这Connection: close为每个响应添加了HTTP标头,似乎在本地工作正常.
在客户现场,这仍然没有工作,并生产相同Network error: 0x2ee4.
值得注意的是,客户使用McAfee Web Gateway作为转发代理,它位于浏览器< - >服务器通信的中间.
长话短说,我发现问题出现在以下内容:当页面加载时,有多个GET请求被发送到服务器以获取页面,资源等.然后在使用它10秒后(我的webapp是单页 -应用程序,因此用户可能在同一页面上花费超过10分钟)只向服务器发出GWT-RPC请求,这些请求是POST请求.在使用此页面一分钟后(我怀疑1分钟= keep-alive timeout代理服务器)这些POST请求开始随机失败,出现0x2ee4网络错误.
在我实现了GWT-RPC重试功能后,我发现在重试30秒后,所有 GWT-RPC请求都会因上述错误而失败.刷新页面再次解决了这个问题一分钟左右然后发生同样的故事.
所以,我想通了,蹩脚的IE11和IE10是正确处理SSL相结合,保活和POST请求.看来,IE10和IE11似乎无法使用POST请求更新keep-alive ssl连接,只能使用GET请求执行此操作.请注意,Chrome,Firefox和其他普通浏览器都能很好地处理这种情况.在Firebug中检查Firefox在这种情况下的行为时:可以清楚地看到POST请求已经完成,然后显示为中止0.5秒,然后显示为成功(我怀疑Firefox处理这种特定情况,向服务器本身发出GET请求以更新SSL保持连接,然后重试POST请求)
因此,为了解决IE中的这个问题,我简单地实现了每隔5秒就用"GET"请求"ping"服务器的功能(准备好尝试这个时间,因为这很可能与客户的代理keep-alive超时有关).
这使它工作(请注意,在这种情况下,不需要上面的Apache2配置hack)
我真的希望这能帮助有类似问题的人,节省他们的时间
使用的资源:
PS我会向Microsoft报告此IE10和IE11问题吗? - 在我已经花了一个多星期的时间找出问题后,我真的不急于花30多分钟的时间报告商业蹩脚的IE浏览器问题.
我坚持上推荐的Chrome或火狐或其它正常的浏览器,以客户为可行的选择,我仍然认为,IE11不适合现代的网站与AJAX
| 归档时间: |
|
| 查看次数: |
2883 次 |
| 最近记录: |