Gwt Google Web Toolkit延迟绑定问题

Gwt Google Web Toolkit延迟绑定问题,gwt,activex,xmlhttprequest,same-origin-policy,Gwt,Activex,Xmlhttprequest,Same Origin Policy,大约2年前,我使用GWT开发了一个web应用程序,从那时起,该应用程序不断发展。在当前状态下,它依赖于获取单个XML文件并解析其中的信息。总的来说,这很有效。这个应用程序的一个要求是它需要能够从文件系统运行file:///.. 以及从Web服务器运行的传统模式 使用对象从Web服务器获取此文件的工作方式与预期完全相同。从文件系统Firefox、Opera、Safari和Chrome运行应用程序时,它们的行为都符合预期。当使用IE7或IE8从文件系统运行应用程序时,调用失败,有关错误的信息表明访问

大约2年前,我使用GWT开发了一个web应用程序,从那时起,该应用程序不断发展。在当前状态下,它依赖于获取单个XML文件并解析其中的信息。总的来说,这很有效。这个应用程序的一个要求是它需要能够从文件系统运行file:///.. 以及从Web服务器运行的传统模式

使用对象从Web服务器获取此文件的工作方式与预期完全相同。从文件系统Firefox、Opera、Safari和Chrome运行应用程序时,它们的行为都符合预期。当使用IE7或IE8从文件系统运行应用程序时,调用失败,有关错误的信息表明访问文件时存在问题,因为违反了。 该应用程序在IE6中按预期工作,但在IE7或IE8中没有

因此,我查看了的源代码,发现实际的请求是使用XMLHttpRequest GWT对象执行的。因此,我查看了源代码并找到了一些信息

下面是从XMLHttpRequest.java的第83行开始的代码

  public static native XMLHttpRequest create() /*-{
    if ($wnd.XMLHttpRequest) {
      return new XMLHttpRequest();
    } else {
      try {
        return new ActiveXObject('MSXML2.XMLHTTP.3.0');
      } catch (e) {
        return new ActiveXObject("Microsoft.XMLHTTP");
      }
    }
  }-*/;
因此,如果XMLHttpRequest不能像IE6中那样创建,因为它不可用,那么基本上会使用ActiveXObject

我读了更多关于XMLHttpRequest的IE实现的内容,它似乎只支持与Web服务器上的文件交互

我在IE8工具->互联网选项->高级->安全->启用本机XMLHTTP支持中找到了一个设置,当我取消选中此框时,我的应用程序可以工作。我认为这是因为我很少告诉IE不要使用XmlHttpRequest的实现,所以GWT只使用ActiveXObject,因为它认为原生XmlHttpRequest不可用

这解决了问题,但很难长期解决

我目前可以捕获一个失败的发送请求,并验证它是否试图使用普通GWT从文件系统中获取XML文件。在本例中,我想做的是捕获IE7和IE8案例,让它们使用ActiveXObject而不是本机XmlHttpRequest对象

GWT谷歌集团发布了一条帖子,该帖子对这个问题提出了一个假定的解决方案。看着它,我可以看出它是为一个较旧版本的GWT创建的。我使用的是最新版本,我认为这或多或少是我想要做的,我想用它来检测特定的浏览器类型,并运行我自己的XMLHttpRequest.java实现来代替内置的GWT实现

下面是我正在尝试使用的代码

package com.mycompany.myapp.client;

import com.google.gwt.xhr.client.XMLHttpRequest;

public class XMLHttpRequestIE7or8 extends XMLHttpRequest
{
    // commented out the "override" so that eclipse and the ant build script don't throw errors
    //@Override
    public static native XMLHttpRequest create()
    /*-{
        try
       {
            return new ActiveXObject('MSXML2.XMLHTTP.3.0');
       }
       catch (e)
       {
           return new ActiveXObject("Microsoft.XMLHTTP");
       }
    }-*/;

    // have an empty protected constructor so the ant build script doesn't throw errors
    // the actual XMLHttpRequest constructor is empty as well so this shouldn't cause any problems
    protected XMLHttpRequestIE7or8()
    {
    }
};
下面是我添加到模块xml中的行

<replace-with class="com.mycompany.myapp.client.XMLHttpRequestIE7or8">
    <when-type-is class="com.google.gwt.xhr.client.XMLHttpRequest"/>
    <any>
        <when-property-is name="user.agent" value="ie6" />
        <when-property-is name="user.agent" value="ie8" />
    </any>
</replace-with>
据我所知,这应该是可行的,但我的代码从未运行过

有人知道我做错了什么吗

我不应该通过延迟绑定来实现这一点,而应该在捕获失败案例时使用本机javascript吗

有没有一种不同的方法来解决我没有提到的这个问题

欢迎所有回复。

请注意,ie7不是user.agent的有效值-ie6是Internet Explorer 6和Internet Explorer 7的值请参阅如何计算user.agent

可能此无效值导致GWT完全避免使用您的代码?

请注意,ie7不是user.agent的有效值-ie6是Internet Explorer 6和Internet Explorer 7的值请参阅如何计算user.agent


也许这个无效值导致GWT完全避免使用您的代码?

您缺少一个关键的东西—对GWT.create的调用

为了工作,必须有人在com.google.GWT.xhr.client.XMLHttpRequest类上调用GWT.create,只有这样,您才能获得特定于您需要的实现。如果查看RequestBuilder.java,它会直接实例化XMLHttpRequest对象。也就是说,没有对GWT.create的调用,因此您的特定于IE的实现不会被接受

要解决这个问题,你必须更换这条线

XMLHttpRequest XMLHttpRequest=XMLHttpRequest.create

XMLHttpRequest XMLHttpRequest=GWT.createXMLHttpRequest.class

所以,你要么修改GWT的源代码,然后重新编译,真恶心!,或者你做这样的事情-

子类RequestBuilder和重写sendRequest方法。 从doSend方法复制/粘贴所有内容,但替换上面提到的一行 在代码中执行盲grep,并用MyRequestBuilder替换RequestBuilder的所有实例
我想这应该可以解决您的问题。

您缺少一件关键的事情—调用GWT.create

为了工作,必须有人在com.google.GWT.xhr.client.XMLHttpRequest类上调用GWT.create,只有这样,您才能获得特定于您需要的实现。如果查看RequestBuilder.java,它会直接实例化XMLHttpRequest对象。也就是说,没有对GWT.create的调用,因此您的特定于IE的实现不会被接受

要解决这个问题,你必须更换这条线

XMLHttpRequest XMLHttpRequest=XMLHttpRequest.create

XMLHttpRequest XMLHttpRequest=GWT.createXMLHttpRequest.class

所以,你要么修改GWT的源代码,然后重新编译,真恶心!,或者你做这样的事情-

子类RequestBuilder和重写sendRequest方法。 从doSend方法复制/粘贴所有内容,但替换上面提到的一行 在代码中执行盲grep,并用MyRequestBuilder替换RequestBuilder的所有实例
我想这应该能解决你的问题。

谢谢你的建议。我已经用这些信息更新了我的代码和问题,但不幸的是问题仍然存在谢谢你的建议。我已经用这些信息更新了我的代码和问题,但不幸的是问题仍然存在