Firefox XMLHttpRequest устанавливает флаг ошибки в ответе 302 - PullRequest
2 голосов
/ 17 декабря 2009

У меня есть веб-приложение, управляемое сервлетом, которое блокирует сеансы пользователей после определенного периода бездействия путем перенаправления на страницу входа. У меня был код в веб-клиенте, который проверил это, по сути, похоже на следующее:

function error(request, errtype) {
    if (request.status == 302) {
        // Display a "timed out" dialog, then:
        window.location = request.getResponseHeader("Location");
    }
}

Однако недавно эта схема перестала работать; по истечении тайм-аута значение request.status равнялось 0. Используя Firebug, я мог видеть, что возвращается тот же ответ HTTP 302.

Я внимательно прочитал спецификацию для XMLHttpRequest и нашел этот раздел:

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

В противном случае это ошибка сети.

Я даже не знал, что клиенты должны автоматически следовать перенаправлениям, которые они получают в ответ на запросы Ajax; браузеры, которые меня интересуют, не делали этого раньше, так как мой код выше работал. Я недавно обновил свою версию Firefox, которая теперь, возможно, более точно соответствует спецификации. Ошибка сети, предписанная спецификацией, объясняет код ответа с нулевым значением, который я вижу. Тем не менее, я получаю перенаправление на тот же хост (хотя и на другой порт), не должно быть бесконечного цикла, и схема остается HTTP, поэтому я не понимаю, почему я получаю сетевую ошибку .

Есть идеи?

1 Ответ

0 голосов
/ 18 декабря 2009

как у вас получается эта функция? если вы отправляете сообщение об ошибке «200», очевидно, это не сработает ...

request.onreadystatechange = function( )
{
   if( this.readyState == 4 )
   {
      // if we got a 200
      if( this.status == 200 ){ /* cool */ }

      // if we got anything else
      else { error( this, this.status ); }
   }
};

Но я предполагаю, что вы это знаете. Кроме того, вам, вероятно, следует включить .href в конце window.location и, возможно, местоположение по умолчанию на случай

// Display a "timed out" dialog, then:
window.location.href = request.getResponseHeader("Location") || defaultPage;

Если это не сработает, вы можете попробовать другой статус в методе onreadystatechange, так как некоторые браузеры могут интерпретировать состояние, отличное от 200, как ошибку. Это могут быть (из той же спецификации, с которой вы читаете):

0 (if it's considered aborted after unset, though unlikely)
2 (headers-sent) as that 302 code is actually a HTTP header

удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...