обнаружение JSON, загруженного браузером - PullRequest
3 голосов
/ 31 октября 2008

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

{"authentication":"required"}

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

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

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

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

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

Ура, Дон

Ответы [ 4 ]

3 голосов
/ 31 октября 2008

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

1 голос
/ 31 октября 2008

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

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

URL: http://domain/page.jsp?ajaxRequest=true будет выводить только JSON

URL: http://domain/page.jsp будет отображать страницу JSP, которая может пересылать на другую страницу.

OR

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

0 голосов
/ 20 ноября 2008

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

{"error":"authentication required"}

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

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

В вашем скрипте ожидается обработчик:

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

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

0 голосов
/ 31 октября 2008

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

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

, например

if(Accept contains application/json...) { // client asking for json, likely  to be XHR
  return {"foo":"bar"}
} else { // other
  return "Location: /login-please";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...