Данные ответа JQuery Form JSON NULL в Internet Explorer

Я использую плагин Malsup JQuery Form с Spring MVC для выполнения некоторых запросов Ajax.

У меня возникла проблема с IE (сюрприз-сюрприз).

Javascript-код:

var options = {
    type: "POST",
    cache: false,
    success: displayList,
    error: errorList,
    url: 'test.jsp',
    dataType: 'json'
};

$('form').ajaxSubmit(options);

function displayPolicyList(responseText, statusText, xhr, $form)
{
    alert(responseText); // Works in all browsers
}


function errorList(xhr, ajaxOptions, thrownError)
{
    alert(xhr.responseText); // Fine in firefox etc, NULL in IE
}

Весенний код:

@ResponseBody
public ResponseEntity<Map<String, String>> erroResponse()
{
    Map<String, String> error = new TreeMap<String, String>();

    error.put("error", message);

    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setContentType(MediaType.TEXT_PLAIN);

    return new ResponseEntity<Map<String, String>>(error, responseHeaders,
                                              HttpStatus.INTERNAL_SERVER_ERROR);
}

Все отлично работает во всех браузерах при успехе. Я могу читать и анализировать ответ JSON без каких-либо проблем. Проблема возникает, когда я возвращаю 500 с моими сообщениями об ошибках в ответе JSON. В firefox, chrome и т. д. все работает, как и ожидалось, и errorList может анализировать ответ JSON.

Однако в IE JSON имеет значение null. Я вижу в подключаемом модуле JQuery Form, что получаю ту же ошибку перекрестного происхождения (не удается получить доступ к документу ответа: TypeError: Доступ запрещен.), подробно описанный здесь:

Отказано в доступе. на jquery.form.js в IE

Однако я не получаю доступ к междоменному доступу, поскольку это одно приложение.

В плагине JQuery блок, который кажется проблемой:

function getDoc(frame) {
        var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
        return doc;
    }

Когда я возвращаю HttpStatus.CREATED из контроллера, он работает нормально, но любое сбойное событие с сервера приводит к тому, что вышеуказанная функция вызывает исключение.

Есть идеи?


person user2028936    schedule 31.01.2013    source источник
comment
Есть ли в отправленной форме поле файла, которое отправляется?   -  person JAAulde    schedule 31.01.2013
comment
Оно делает. Все это работает в случае успешного ответа от Контроллера. Проблема заключается в том, что я возвращаю 500 из контроллера на основе некоторой внутренней проверки представленных данных.   -  person user2028936    schedule 31.01.2013
comment
Есть ли у вас специальная обработка для нормального ответа, когда JSON возвращается в TEXTAREA? Когда я отправляю форму с помощью этого плагина, форма которой имеет входной файл и поступает из IE, я должен обернуть ответы JSON в TEXTAREA из-за того, что IE требует псевдо-ajax (через iframe). Вам нужно будет добавить ту же специальную обработку в ответ 500.   -  person JAAulde    schedule 31.01.2013
comment
Вы говорите о том, что IE пытается сохранить ответы JSON вместо того, чтобы печатать их? Я добавил точно такую ​​же обработку как для успеха, так и для ответа на ошибку. В приведенном выше коде, если я изменю HttpStatus.INTERNAL_SERVER_ERROR на HttpStatus.OK, функция getDoc(frame) будет работать, но это нехорошо, поскольку ответ идентифицируется как успешный ответ, и я бы предпочел не делать уродливый взлом распечатать сообщения об ошибках   -  person user2028936    schedule 31.01.2013
comment
Если я вас правильно понял, то нет, я не об этом. Я имею в виду третий абзац в jquery.malsup.com/form/#file-upload< /а>   -  person JAAulde    schedule 31.01.2013
comment
Я не думаю, что это проблема. Если я проверю ответное сообщение в плагине JQuery Form, я увижу, что в случае, когда я возвращаю 500 бросков frame.contentWindow и frame.contentDocument и Access Denied. Структура, заголовки и содержимое того, что я возвращаю, абсолютно одинаковы в обоих случаях. Единственное отличие HttpStatus.INTERNAL_SERVER_ERROR от HttpStatus.OK   -  person user2028936    schedule 31.01.2013
comment
Мое единственное другое предложение, которое исключило бы то, что я предложил как проблему, — удалить поле файла и посмотреть, сохраняется ли проблема.   -  person JAAulde    schedule 31.01.2013


Ответы (1)


Я получил то же сообщение об ошибке, потому что мой ответ содержал следующий заголовок http:

X-Frame-Options: DENY

Удаление его или изменение значения заголовка на SAMEORIGIN решило это для меня.

Подробнее читайте здесь: http://blog.mozilla.org/security/2010/09/08/x-frame-options/

person Jacob Coens    schedule 13.02.2013