В каком случае запрос AJAX может не устанавливать файлы cookie на странице, с которой был запущен AJAX? - PullRequest
0 голосов
/ 08 февраля 2012

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

  1. В момент A клиент заходит на нашу страницу:

    • без печенья
    • возвращает ответ с Set-Cookie заголовком ответа HTTP, который дает им идентификатор сеанса B
    • В теле есть JS для запуска AJAX-запроса /ajax/foo.
  2. В момент времени A + 1 секунда клиент отправляет нам запрос AJAX на /ajax/foo

    • для реферера задана страница на шаге 1, которая запустила AJAX, как и ожидалось
    • без печенья - почему?
    • возвращает ответ с заголовком Set-Cookie, который дает им идентификатор сеанса C (ожидается, так как они не отправили нам cookie)
  3. Через некоторое время все клиентские запросы отправляют либо идентификатор сеанса B, либо C - поэтому проблема в , а не в том, что в браузере отключены файлы cookie.

Похоже, что это, по сути, условие гонки: запрос главной страницы и запрос AJAX выполняются очень близко по времени, и без файлов cookie, и существует гонка за установку файлов cookie. Один выигрывает, а другой проигрывает.

Что меня озадачивает, как это могло случиться? Я предполагаю, что к тому времени, когда браузер прочтет достаточно ответа, чтобы знать, что ему нужно запустить AJAX-запрос, он уже получил заголовки ответа HTTP и, таким образом, заголовок ответа Set-Cookie. Поэтому мне кажется, что клиент всегда будет отправлять обратно cookie, который мы установили на странице, которая запустила AJAX-запрос. Я просто не понимаю, как это может произойти, если браузер не обрабатывает ответ Set-Cookie незамедлительно.

Как я уже сказал, я не могу воспроизвести это в Firefox, Safari или Chrome, но мы видим это несколько раз в день.

Ответы [ 2 ]

1 голос
/ 26 февраля 2013

a) Есть ли у cookie срок годности?

b) Если да, пытались ли вы воспроизвести его, установив часы компьютера вперед или назад более чем на TTL cookie?(Я имею в виду часы компьютера, на котором запущен браузер; очевидно, это не сервер, на котором выполняется приложение ... это должен быть отдельный компьютер, часы которого установлены точно.)

Я тоже это видел;Похоже, что он запускается пользователями с испорченными системными часами.Файл cookie был отправлен с датой истечения срока действия, которая, с точки зрения браузера, уже прошла.

1 голос
/ 09 февраля 2012

В Google Chrome появилась новая функция, которая может привести к такому поведению.Это называется prerender.

Предварительная визуализация - это экспериментальная функция в Chrome (версии 13 и выше), которая может получить подсказки от автора сайта для ускорения работы пользователей в Интернете.Автор сайта включает в HTML элемент, который инструктирует Chrome извлекать и отображать дополнительную страницу до того, как пользователь фактически щелкнет по ней.

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

Для получения дополнительной информации читайте: http://code.google.com/chrome/whitepapers/prerender.html

Редактировать:
Вы можете запустить предварительный рендеринг на своей странице с помощью: http://prerender -test.appspot.com /

...