重新访问GWT-RPC和臭名昭着的偶发"StatusCodeException:0"异常

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.comhttps://site.com指向同一个IP,并有只有一个Tomcat的web应用程序正是服务于相同的资源两个https://sub.site.comhttps://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:可以简单地重试请求,或者此请求可能已到达服务器并进行修改,因此重试它可能会产生重复修改?

将尝试设置转发代理来模拟可能的客户设置,以至少重现上述错误...

我非常感谢任何帮助!

Yur*_*nyy 8

好吧,所以在经历了这个工作周的问题之后我终于设法解决了.

实际上,当我在Tomcat前面安装Apache2服务器并使用IE11从另一个VirtualBox Win7主机访问它时,我能够在本地重现非常类似的问题.这给了我零星StatusCodeException: 0Network 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)

我真的希望这能帮助有类似问题的人,节省他们的时间

使用的资源:

  1. IE网络错误0x2ef3问题1
  2. IE网络错误0x2ef3问题2
  3. IE网络错误0x2ef3问题3
  4. 关于如何实现透明GWT-RPC重试功能的真棒q&a

PS我会向Microsoft报告此IE10和IE11问题吗? - 在我已经花了一个多星期的时间找出问题后,我真的不急于花30多分钟的时间报告商业蹩脚的IE浏览器问题.

我坚持推荐的Chrome火狐其它正常的浏览器,以客户为可行的选择,我仍然认为,IE11不适合现代的网站与AJAX


归档时间:

查看次数:

2883 次

最近记录:

11 年,2 月 前