Подтвердить что ты не робот

Проблема Symfony $request-> isXmlHttpRequest()

Мне нужно проверить, является ли запрос ajax. $request->isXmlHttpRequest() работает нормально, однако, если во время выполнения есть перенаправление, этот метод возвращает false. Как еще я могу проверить, является ли запрос ajax в этом случае? постскриптум ajax инициируется jQuery

4b9b3361

Ответ 1

Если вы перенаправляете arent к другому приложению в вашем проекте или другому внешнему uri, просто используйте forward, если isXmlHttpRequest истинно при первом запросе.


Хорошо, что этот метод проверяет значение заголовка X-Requested-with, а в некоторых реализациях браузера этот заголовок (или все исходные заголовки) отбрасывается/перезаписывается из перенаправленного запроса (FF, чтобы назвать его).

В качестве обходного пути вы можете использовать переменную в самом запросе. Возможно, вы сможете использовать существующую инфраструктуру sf_format, но я не уверен, что это сработает, потому что я не знаком с тем, как она работает внутри.

Ответ 2

Некоторые js-библиотеки не отправляют значение XmlHttpRequest в заголовках, просто добавьте это в свой script:

xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");

Ответ 3

Если вам нужно легкое обходное решение, я бы предложил

Используйте URL-адрес, например http://mywebsite.com/loadsomething.php?ajax=true и

$isAjax = $request->getParameter('ajax');

Или, если вы используете POSTING, вы можете создать скрытое поле с именем "ajax". Конечно, это не решит вашу проблему навсегда, но будет работать как быстрое решение, если вам нужно это как можно скорее.

Если вы хотите поддерживать только одно перенаправление, вы также можете создать флэш-переменную.

В противном случае вы можете посмотреть исходный код symfony:

http://trac.symfony-project.org/browser/branches/1.4/lib/request/sfWebRequest.class.php

В строке 518 вы можете увидеть, что объект запроса идентифицирует запрос как ajax из заголовков HTTP. Поэтому вам нужно выяснить, что после перенаправления, почему одни и те же HTTP-заголовки установлены неправильно.