обнаружение JSON, загруженного браузером
-
05-07-2019 - |
Вопрос
У меня есть приложение, в котором большинство запросов отправляется через AJAX, хотя некоторые отправляются через "обычные" HTTP-запросы.Если запрос отправлен и время ожидания сеанса пользователя истекло, возвращается следующий JSON:
{"authentication":"required"}
Функция JavaScript, которая отправляет все AJAX-запросы, обрабатывает этот ответ, показывая всплывающее сообщение и перенаправляя пользователя обратно на страницу входа.
Однако, когда запрос, отличный от AJAX, получает этот ответ, JSON просто отображается в браузере, потому что ответ обрабатывается непосредственно браузером (т.е.вышеупомянутая функция JavaScript обойдена).Очевидно, что это не идеально, и я бы хотел, чтобы запросы, отличные от AJAX, которые получают этот ответ, вели себя так же, как запросы AJAX.Чтобы достичь этого, я могу придумать 2 варианта:
Пройдите через приложение и преобразуйте все запросы в AJAX-запросы.Это сработало бы, но также могло бы занять много времени!
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
.