Я разработал веб-приложение с использованием 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, когда я поймаю случай отказа?
Есть ли другой способ приблизиться к этой проблеме, о которой я не упомянул?
Все ответы приветствуются.
Благодарим вас за предложение. Я обновил свой код и вопрос с этой информацией, но, к сожалению, проблема все еще существует – snctln