Вопрос

У меня есть приложение, в котором большинство запросов отправляется через AJAX, хотя некоторые отправляются через "обычные" HTTP-запросы.Если запрос отправлен и время ожидания сеанса пользователя истекло, возвращается следующий JSON:

{"authentication":"required"}

Функция JavaScript, которая отправляет все AJAX-запросы, обрабатывает этот ответ, показывая всплывающее сообщение и перенаправляя пользователя обратно на страницу входа.

Однако, когда запрос, отличный от AJAX, получает этот ответ, JSON просто отображается в браузере, потому что ответ обрабатывается непосредственно браузером (т.е.вышеупомянутая функция JavaScript обойдена).Очевидно, что это не идеально, и я бы хотел, чтобы запросы, отличные от AJAX, которые получают этот ответ, вели себя так же, как запросы AJAX.Чтобы достичь этого, я могу придумать 2 варианта:

  1. Пройдите через приложение и преобразуйте все запросы в AJAX-запросы.Это сработало бы, но также могло бы занять много времени!

  2. JSON, показанный выше, генерируется очень простым JSP.Мне интересно, возможно ли добавить обработчик событий JavaScript к этому JSP, который запускается непосредственно перед отображением содержимого в браузере - я предполагаю, что это никогда не будет вызываться для запросов AJAX?Этот обработчик может вызывать другой код JavaScript, который отображает всплывающее окно и выполняет перенаправление.

Если кто-нибудь знает, как именно я могу реализовать обработчик, который я описал в (2), или у него есть какие-либо другие потенциальные решения, я был бы очень признателен, если бы они передали их дальше.

Приветствия, Дон

Это было полезно?

Решение

Вы не можете добавить обработчик в JSP таким образом.Все, что вы к нему добавите, сделает его страницей, не использующей JSON.

Есть два варианта, которые я вижу:Добавьте параметр на страницу, добавив параметр URL к экрану, который изменяет выходные данные.

URL - АДРЕС: http://domain/page.jsp?ajaxRequest=true выводил бы только json

URL - АДРЕС: http://domain/page.jsp отобразила бы страницу jsp, которую можно было бы перенаправить на другую страницу.

или

измените ответ, чтобы в JSP был код пересылки, который будет выполняться веб-браузером при прямом попадании в него.Затем попросите вызывающий AJAX удалить код пересылки, а затем обработайте то, что осталось.

Другие советы

3) Измените свой AJAX-код, чтобы добавить переменную в GET или POST: outputJson=1

4) Прочтите HTTP-заголовок запроса "Принять".

Затем на стороне сервера адаптируйте выходные данные:

например ,

if(Accept contains application/json...) { // client asking for json, likely  to be XHR
  return {"foo":"bar"}
} else { // other
  return "Location: /login-please";
}

Начните с более разумного сообщения об ошибке, подобного этому:

{"error":"authentication required"}

Оберните вывод JSON в обратный вызов:

errorHandler({"error":"authentication required"});

Имейте обработчик, ожидающий в вашем скрипте:

function errorHandler(r) {
   alert(r.error);
}

И не забудьте отправить это как text/javascript и не application/x-json.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top