Я использую $.post()
для вызова сервлета Ajax, а затем использую полученный HTML-фрагмент для замены div
элемента на текущей странице пользователя. Однако, если время сеанса истекло, сервер отправляет директиву перенаправления, чтобы отправить пользователя на страницу входа. В этом случае jQuery заменяет div
элемент содержимым страницы входа в систему, заставляя пользователя увидеть действительно редкую сцену.
Как я могу управлять директивой перенаправления от вызова Ajax с jQuery 1.2.6?
javascript
jquery
ajax
redirect
Эллиот Варгас
источник
источник
HttpContext.Response.AddHeader
И проверка на ajaxsetup Sucess является путьОтветы:
Я прочитал этот вопрос и реализовал подход, который был заявлен в отношении установки кода состояния ответа HTTP на 278, чтобы браузер прозрачно не обрабатывал перенаправления. Несмотря на то, что это сработало, я был немного недоволен, так как это немного хакерство.
После дальнейших исследований я отказался от этого подхода и использовал JSON . В этом случае все ответы на запросы AJAX имеют код состояния 200, а тело ответа содержит объект JSON, созданный на сервере. Затем JavaScript на клиенте может использовать объект JSON, чтобы решить, что ему нужно делать.
У меня была похожая проблема с твоей. Я выполняю AJAX-запрос, который имеет 2 возможных ответа: один перенаправляет браузер на новую страницу, а другой заменяет существующую HTML-форму на текущей странице новой. Код jQuery для этого выглядит примерно так:
Объект JSON «данные» создается на сервере, чтобы иметь 2 члена:
data.redirect
иdata.form
. Я нашел этот подход намного лучше.источник
Я решил эту проблему:
Добавление пользовательского заголовка к ответу:
Привязка функции JavaScript к
ajaxSuccess
событию и проверка, существует ли заголовок:источник
Ни один браузер не обрабатывает ответы 301 и 302 правильно. И на самом деле в стандарте даже говорится, что они должны обращаться с ними «прозрачно», что является огромной головной болью для поставщиков Ajax Library. В Ra-Ajax мы были вынуждены использовать код состояния ответа HTTP 278 (просто некоторый «неиспользованный» код успеха) для прозрачной обработки перенаправлений с сервера ...
Это действительно раздражает меня, и если у кого-то здесь есть некоторая «тяга» в W3C, я был бы признателен, если бы вы сообщили W3C , что нам действительно нужно обрабатывать коды 301 и 302 самостоятельно…! ;)
источник
Решение, которое в конечном итоге было реализовано, заключалось в использовании оболочки для функции обратного вызова вызова Ajax, и в этой оболочке проверяется наличие определенного элемента в возвращенном фрагменте HTML. Если элемент был найден, то оболочка выполняет перенаправление. Если нет, то оболочка перенаправила вызов в функцию фактического обратного вызова.
Например, наша функция-обертка была что-то вроде:
Затем при вызове Ajax мы использовали что-то вроде:
Это сработало для нас, потому что все вызовы Ajax всегда возвращали HTML внутри элемента DIV, который мы используем для замены части страницы. Кроме того, нам нужно было только перенаправить на страницу входа.
источник
Мне нравится метод Тиммерца с легким поворотом лимона. Если вы когда - нибудь вернулся CONTENTTYPE из текста / HTML , когда вы ожидаете JSON , вы, скорее всего перенаправлены. В моем случае я просто перезагружаю страницу, и она перенаправляется на страницу входа. О, и проверьте, что статус jqXHR равен 200, что кажется глупым, потому что вы находитесь в функции ошибок, верно? В противном случае допустимые ошибки приводят к повторной перезагрузке (упс)
источник
Используйте низкоуровневый
$.ajax()
вызов:Попробуйте это для перенаправления:
источник
Я просто хотел поделиться своим подходом, так как это может кому-то помочь:
Я в основном включил модуль JavaScript, который обрабатывает такие вещи, как отображение имени пользователя, а также этот случай, обрабатывая перенаправление на страницу входа .
Мой сценарий: у нас в основном ISA-сервер, который слушает все запросы и отвечает 302 и заголовком местоположения на нашей странице входа.
В моем модуле JavaScript мой первоначальный подход был что-то вроде
Проблема (как многие здесь уже упоминали) заключается в том, что браузер обрабатывает перенаправление самостоятельно, поэтому мой
ajaxComplete
обратный вызов никогда не вызывался, но вместо этого я получил ответ от уже перенаправленной страницы входа, которая, очевидно, былаstatus 200
. Проблема: как вы определяете, является ли успешный ответ 200 вашей реальной страницей входа или просто какой-то другой произвольной страницей?Решение
Так как я не смог перехватить 302 ответа на перенаправление, я добавил
LoginPage
на свою страницу входа заголовок, который содержал URL самой страницы входа. В модуле я сейчас слушаю заголовок и делаю редирект:... и это работает как шарм :). Вы можете удивиться, почему я включил URL в
LoginPage
заголовок ... ну, в основном, потому что я не нашел способа определить URL вGET
результате автоматического перенаправления местоположения сxhr
объекта ...источник
X-
, поэтому лучше использовать заголовокX-LoginPage: http://example.com/login
.X-
.Я знаю, что эта тема старая, но я дам еще один подход, который я нашел и ранее описал здесь . В основном я использую ASP.MVC с WIF (но это не очень важно для контекста этой темы - ответ адекватен независимо от того, какие платформы используются. Ключ остается неизменным - решение проблем, связанных с ошибками аутентификации при выполнении запросов AJAX ) .
Подход, показанный ниже, может применяться ко всем Ajax-запросам из коробки (если они явно не переопределяют событие beforeSend).
Перед выполнением любого ajax-запроса вызывается
CheckPulse
метод (метод контроллера, который может быть простым):Если пользователь не аутентифицирован (токен истек), такой метод недоступен (защищен
Authorize
атрибутом). Поскольку инфраструктура обрабатывает аутентификацию, а срок действия токена истекает, она добавляет http-статус 302 в ответ. Если вы не хотите, чтобы ваш браузер обрабатывал отклик 302 прозрачно, перехватите его в Global.asax и измените статус ответа - например, на 200 OK. Кроме того, добавьте заголовок, который инструктирует вас обрабатывать такой ответ особым образом (позже на стороне клиента):Наконец, на стороне клиента проверьте наличие такого пользовательского заголовка. Если присутствует - полное перенаправление на страницу входа в систему (в моем случае
window.location
заменяется URL-адрес из запроса, который обрабатывается моей платформой автоматически).источник
Я думаю, что лучший способ справиться с этим - использовать существующие коды ответов протокола HTTP, в частности
401 Unauthorized
.Вот как я это решил:
Клиентская сторона: привязка к событиям ajax
IMO, это более общий вид, и вы не пишете новые пользовательские спецификации / заголовки. Вам также не нужно изменять какие-либо из ваших существующих вызовов ajax.
Редактировать: согласно комментарию @Rob ниже, 401 (код статуса HTTP для ошибок аутентификации) должен быть индикатором. Посмотрите 403 Запрещенных против 401 Несанкционированных HTTP-ответов для получения дополнительной информации. При этом некоторые веб-фреймворки используют 403 как для аутентификации, так и для ошибок авторизации - поэтому адаптируйтесь соответственно. Спасибо, Роб.
источник
Я решил эту проблему следующим образом:
Добавьте промежуточное программное обеспечение для обработки ответа, если это перенаправление для запроса ajax, измените ответ на обычный ответ с URL-адресом перенаправления.
Затем в ajaxComplete, если ответ содержит перенаправление, он должен быть перенаправлением, поэтому измените местоположение браузера.
источник
У меня есть простое решение, которое работает для меня, без необходимости изменения кода сервера ... просто добавьте чайную ложку мускатного ореха ...
Я проверяю наличие тега html, но вы можете изменить indexOf для поиска любой уникальной строки, существующей на вашей странице входа в систему ...
источник
Другое решение, которое я нашел (особенно полезно, если вы хотите установить глобальное поведение), - это использовать
$.ajaxsetup()
метод вместе сstatusCode
свойством . Как указали другие, не используйте код перенаправления status (3xx
), вместо этого используйте4xx
код состояния и обрабатывайте перенаправление на стороне клиента.Замените
400
на код состояния, который вы хотите обработать. Как уже упоминалось,401 Unauthorized
может быть хорошей идеей. Я использую,400
так как это очень неспецифично, и я могу использовать401
для более конкретных случаев (например, неверные учетные данные для входа). Таким образом, вместо прямого перенаправления ваш сервер должен возвращать4xx
код ошибки, когда время сеанса истекло, и вы обрабатываете перенаправление на стороне клиента. Прекрасно работает для меня даже с такими фреймворками, как backbone.jsисточник
Большинство данных решений используют обходной путь, используя дополнительный заголовок или неправильный HTTP-код. Эти решения, скорее всего, будут работать, но чувствуют себя немного «хаки». Я придумал другое решение.
Мы используем WIF, который настроен на перенаправление (passiveRedirectEnabled = "true") на ответ 401. Перенаправление полезно при обработке обычных запросов, но не будет работать для запросов AJAX (поскольку браузеры не будут выполнять перенаправление 302 /).
Используя следующий код в вашем global.asax, вы можете отключить перенаправление для запросов AJAX:
Это позволяет вам возвращать 401 ответ на запросы AJAX, которые ваш javascript может затем обработать, перезагрузив страницу. При перезагрузке страницы выдается 401, который будет обрабатываться WIF (и WIF перенаправит пользователя на страницу входа).
Пример javascript для обработки ошибок 401:
источник
Эта проблема может возникнуть при использовании метода RedirectToAction ASP.NET MVC. Чтобы форма не отображала ответ в div, вы можете просто использовать фильтр ответов ajax для входящих ответов с помощью $ .ajaxSetup . Если ответ содержит перенаправление MVC, вы можете оценить это выражение на стороне JS. Пример кода для JS ниже:
Если data: "window.location = '/ Acount / Login'", то фильтр выше поймает это и выполнит перенаправление вместо того, чтобы позволить отображению данных.
источник
data
находится в теле ответа или заголовке?Собрав воедино то, что Владимир Прудников и Томас Хансен сказали:
Это заставляет браузер воспринимать ответ как успешный и передает его в свой Javascript.
источник
источник
Пытаться
Поместите это на страницу входа. Если он был загружен в div на главной странице, он будет перенаправлять на страницу входа. «#site» - это идентификатор div, который находится на всех страницах, кроме страницы входа.
источник
Хотя ответы, кажется, работают для людей, если вы используете Spring Security, я обнаружил, что расширение LoginUrlAuthenticationEntryPoint и добавление специального кода для обработки AJAX более надежны. Большинство примеров перехватывает все перенаправления, а не только ошибки аутентификации. Это было нежелательно для проекта, над которым я работаю. Может также возникнуть необходимость расширить ExceptionTranslationFilter и переопределить метод «sendStartAuthentication», чтобы удалить шаг кэширования, если вы не хотите, чтобы неудавшийся AJAX-запрос кэшировался.
Пример AjaxAwareAuthenticationEntryPoint:
Источники: 1 , 2
источник
Я решил это, разместив следующее на моей странице login.php.
источник
Позвольте мне еще раз процитировать проблему, описанную @Steg
ИМХО, это реальная проблема, и ее придется официально распространить на текущие стандарты HTTP.
Я полагаю, что новый стандарт Http будет использовать новый код состояния. значение: в настоящее время
301/302
сообщает браузеру, что нужно перейти и получить содержимое этого запроса для новогоlocation
.В расширенном стандарте будет сказано, что если ответ
status: 308
(только пример), то браузер должен перенаправить главную страницу наlocation
предоставленную.Что, как говорится; Я склонен уже подражать этому будущему поведению, и поэтому, когда нужен document.redirect, я отвечаю серверу:
Когда JS получает «
status: 204
», он проверяет наличиеx-status: 308
заголовка и выполняет document.redirect на страницу, указанную вlocation
заголовке.Это имеет какой-то смысл для вас?
источник
Некоторые могут найти следующее полезное:
Я хотел, чтобы клиенты перенаправлялись на страницу входа для любого действия по отдыху, отправляемого без токена авторизации. Поскольку все мои остальные действия основаны на Ajax, мне понадобился хороший общий способ перенаправления на страницу входа вместо обработки функции успеха Ajax.
Вот что я сделал:
На любой Ajax-запрос мой сервер будет возвращать ответ Json 200 «NEUT TO AUTHENTICATE» (если клиент должен пройти аутентификацию).
Простой пример на Java (на стороне сервера):
В моем Javascript я добавил следующий код:
И это все.
источник
в сервлете вы должны положить
response.setStatus(response.SC_MOVED_PERMANENTLY);
xmlHttp-статус «301», необходимый для перенаправления ...и в функции $ .ajax вы не должны использовать
.toString()
функцию ..., простоif (xmlHttp.status == 301) { top.location.href = 'xxxx.jsp'; }
проблема в том, что он не очень гибкий, вы не можете решить, куда хотите перенаправить ..
перенаправление через сервлеты должно быть лучшим способом. но я до сих пор не могу найти правильный способ сделать это.
источник
Я просто хотел фиксировать любые запросы AJAX для всей страницы. @SuperG заставил меня начать. Вот что я закончил:
Я хотел специально проверить определенные коды статуса http, чтобы основывать свое решение. Тем не менее, вы можете просто связаться с ajaxError, чтобы получить что-то кроме успеха (возможно, только 200?), Я мог бы просто написать:
источник
Если вы также хотите передать значения, вы также можете установить переменные сеанса и получить доступ, например: В вашем JSP вы можете написать
И тогда вы можете сохранить это временное значение в переменной JavaScript и поиграть
источник
У меня не было никакого успеха с решением заголовка - они никогда не были подобраны в моем методе ajaxSuccess / ajaxComplete. Я использовал ответ Стег с пользовательским ответом, но я немного изменил сторону JS. Я устанавливаю метод, который я вызываю в каждой функции, чтобы я мог использовать стандарт
$.get
и$.post
методы.Пример этого в использовании ...
источник
Наконец, я решаю проблему, добавив кастом
HTTP Header
. Непосредственно перед ответом на каждый запрос на стороне сервера я добавляю текущий запрошенный URL в заголовок ответа.Мой тип приложения на сервере есть
Asp.Net MVC
, и у него есть хорошее место для этого. вGlobal.asax
I реализованоApplication_EndRequest
событие так:Это прекрасно работает для меня! Теперь в каждом ответе у
JQuery
$.post
меня есть запрошенные,url
а также другие заголовки ответа, которые появляются в результатеPOST
метода по статусу302
,303
....и другая важная вещь заключается в том, что нет необходимости изменять код на стороне сервера или на стороне клиента.
и следующим является возможность получить доступ к другой информации о действиях после публикации, таких как сообщения об ошибках, и т. д., таким образом.
Я написал это, может быть, кто-то поможет :)
источник
У меня была эта проблема в приложении django, с которым я работаю (отказ от ответственности: я стараюсь учиться, и я ни в коем случае не эксперт). Я хотел использовать jQuery ajax для отправки запроса DELETE на ресурс, удалить его на стороне сервера, а затем отправить перенаправление обратно (в основном) на домашнюю страницу. Когда я отправлял
HttpResponseRedirect('/the-redirect/')
из скрипта python, метод jQuery ajax получал 200 вместо 302. Итак, я отправил ответ 300 с:Затем я отправил / обработал запрос на клиенте с помощью jQuery.ajax так:
Может быть, использование 300 не «правильно», но по крайней мере это сработало так, как я хотел.
PS: редактировать мобильную версию SO было огромной болью. Глупый провайдер отправил мой запрос на отмену сервиса прямо после того, как я закончил с моим ответом!
источник
Вы также можете перехватить отправку прототипа XMLHttpRequest. Это будет работать для всех посылок (jQuery / dojo / etc) с одним обработчиком.
Я написал этот код для обработки ошибки 500 страниц с истекшим сроком действия, но он должен работать так же хорошо, чтобы перехватить 200 перенаправления. Подготовьте запись в Википедии на XMLHttpRequest onreadystatechange о значении readyState.
источник
Кроме того, вы, вероятно, захотите перенаправить пользователя на указанный в заголовках URL-адрес. Итак, наконец, это будет выглядеть так:
UPD: Оппс. Есть та же задача, но она не работает. Заниматься этим Я покажу вам решение, когда найду его.
источник
Я получил рабочий solulion , используя ответы из @John и @Arpad ссылки и @RobWinch ссылки
Я использую Spring Security 3.2.9 и jQuery 1.10.2.
Расширьте класс Spring, чтобы вызвать ответ 4XX только на запросы AJAX:
ApplicationContext-security.xml
В моих JSP добавьте глобальный обработчик ошибок AJAX, как показано здесь
Также удалите существующие обработчики ошибок из вызовов AJAX на страницах JSP:
Я надеюсь, что это помогает другим.
Update1 Я обнаружил, что мне нужно добавить опцию (always-use-default-target = "true") в конфигурацию входа в систему. Это было необходимо, поскольку после того, как запрос AJAX перенаправляется на страницу входа в систему (из-за истекшего сеанса), Spring запоминает предыдущий запрос AJAX и автоматически перенаправляет его после входа в систему. Это приводит к отображению возвращенного JSON на странице браузера. Конечно, не то, что я хочу.
Update2 Вместо использования
always-use-default-target="true"
, используйте пример @RobWinch блокировки AJAX-запросов от requstCache. Это позволяет обычным ссылкам перенаправляться на исходную цель после входа в систему, но AJAX переходит на домашнюю страницу после входа в систему.источник