2010-04-16 3 views
1

Я разработал веб-приложение с использованием GWT около 2 лет назад, с тех пор приложение развилось. В текущем состоянии он полагается на выбор одного XML-файла и анализ информации из него. В целом это отлично работает. Требованием этого приложения является то, что он должен быть запущен из файловой системы (файл: /// ..), а также традиционная модель работы с веб-сервера (http://...)Google Web Toolkit Отложенное обязательство №

Получение этого файла из веб-сервер работает точно так, как ожидалось, с помощью объекта RequestBuilder. При запуске приложения из файловой системы Firefox, Opera, Safari и Chrome все ведут себя так, как ожидалось. При запуске приложения из файловой системы с использованием IE7 или IE8 вызов RequestBuilder.send() завершается с ошибкой, информация об ошибке указывает на то, что есть проблема с доступом к файлу из-за нарушения same origin policy. Приложение работает как ожидалось в IE6, но не в IE7 или IE8.

Итак, я посмотрел исходный код RequestBuilder.java и увидел, что фактический запрос выполняется с объектом XMLHttpRequest GWT. Поэтому я просмотрел исходный код для XMLHttpRequest.java и узнал некоторую информацию.

Вот код (начинается в строке 83 в XMLHttpRequest.java)

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 используется вместо этого.

Я прочитал немного больше о реализации XML XMLHttpRequest, и кажется, что он поддерживается только для взаимодействия с файлами на веб-сервере.

Я нашел настройку в IE8 (Инструменты-> Свойства обозревателя-> Дополнительно-> Безопасность-> Включить встроенную поддержку XMLHTTP), когда я сниму этот флажок, мое приложение работает. Я предполагаю, что это связано с тем, что я больше не говорю, что IE не использует их реализацию XmlHttpRequest, поэтому GWT просто использует объект ActiveXObject, потому что он не считает, что собственный XmlHttpRequest доступен.

Это устраняет проблему, но вряд ли является долгосрочным решением.

В настоящее время я могу уловить неудавшийся запрос на отправку и убедиться, что он пытался извлечь XML-файл из файловой системы, используя обычный GWT. То, что я хотел бы сделать в этом случае, - это захватить IE7 и IE8 и использовать их вместо ActiveXObject вместо собственного объекта XmlHttpRequest.

Произошла публикация в группе google GWT, которая предполагала решение этой проблемы (link). Глядя на это, я могу сказать, что он был создан для более старой версии GWT. Я использую последнюю версию и считаю, что это более или менее то, что я хотел бы сделать (используйте GWT deferred binding для определения определенного типа браузера и запуска моей собственной реализации 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, когда я поймаю случай отказа?

Есть ли другой способ приблизиться к этой проблеме, о которой я не упомянул?

Все ответы приветствуются.

ответ

2

Обратите внимание, что ie7 не является допустимым значением для user.agent - ie6 это значение как для Internet Explorer 6 и Internet Explorer 7 (см UserAgent.gwt.xml для того, как user.agent вычисляется).

Возможно, это недопустимое значение приводит к тому, что GWT избегает использования вашего кода в целом?

+0

Благодарим вас за предложение. Я обновил свой код и вопрос с этой информацией, но, к сожалению, проблема все еще существует – snctln

4

У вас не хватает одной ключевой вещи - вызов GWT.create

Для deferred binding на работу, кто-то должен позвонить GWT.create по классу com.google.gwt.xhr.client.XMLHttpRequest - только тогда вы получите реализацию, специфичную для ваших нужд. Если вы посмотрите на RequestBuilder.java, он напрямую создает объект XMLHttpRequest on the first line of deSend() method. То есть, нет ответа на GWT.create(), и, следовательно, ваша реализация, специфичная для IE, не будет получена.

Чтобы решить эту проблему, вы должны заменить эту линию

XMLHttpRequest xmlHttpRequest = XMLHttpRequest.create();

с

XMLHttpRequest xmlHttpRequest = GWT.create(XMLHttpRequest.class);

Таким образом, вы либо изменить источник GWT и пересобрать (YUCK!), или вы делаете что-то вроде этого -

  1. Подкласс RequestBuilder и переопределить метод sendRequest().
  2. Копировать/Вставить все от doSend() метода НО заменить одну строку, я уже упоминал выше
  3. ли слепую-Grep в вашем коде, и заменить все экземпляры RequestBuilder с MyRequestBuilder

Я предполагаю, что должен решить вашу проблему.

+0

Великий .. это работает для меня тоже :) – sunnychayen

Смежные вопросы