Подтвердить что ты не робот

Можно ли использовать событие разгрузки для надежного запроса ajax?

Мне нужен метод для мониторинга сеансов редактирования пользователей, и одно из решений, которые я просматриваю, заставит меня использовать событие unload для отправки запроса ajax для информирования сервера о конце сеанса редактирования. (Смотрите: Мониторинг сеансов пользователей для предотвращения конфликта конфликтов)

Мое (довольно ограниченное) показание в событии unload указывает, что коды, прикрепленные к этому обработчику, должны выполняться быстро, и как таковые обычно используются для очистки объектов, чтобы предотвратить утечку памяти.

Мой вопрос: может ли эта работа достаточно надежно для этой цели?

PS. Я знаю о опции async: false.

4b9b3361

Ответ 1

Этот метод достаточно надежный, если ваш сервер достаточно быстро реагирует. Что-то, на что нужно обратить внимание. Если вы закроете браузер и отправьте запрос AJAX на событие разгрузки, есть очень хороший шанс, что ответ не вернется с сервера вовремя до того, как оконный объект будет уничтожен. Что происходит в этом случае (по крайней мере, с IE), так это то, что он закроет ваш объект соединения и не завершит его корректно до тех пор, пока не будет достигнут тайм-аут соединения. Если ваш сервер не поддерживает подключение к сети, после закрытия 2 окон (при открытии еще одного окна) у вас не будет открытых подключений к серверу (для IE6-7, для окон IE8 - 6) и вы не сможете открыть свой сайт до тех пор, пока не будет достигнут тайм-аут соединения.

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

Похоже, что если вы закроете последнее окно браузера, IE будет правильно уничтожать соединение, но если другое окно открыто, оно не будет.

P.S. И просто чтобы прокомментировать ответ выше, AJAX на самом деле не асинхронный. По крайней мере, реализация JS - это не так. После того, как вы отправите запрос, ваш JS-код все еще ждет ответа с сервера. Он не собирается блокировать выполнение кода, но поскольку сервер может потребоваться некоторое время для ответа (или достаточно долго для завершения Windows для оконного объекта IE), вы можете, возможно, столкнуться с проблемой, описанной выше.

Ответ 2

Вы пытались использовать

var i = new Image(1,1); 
i.src='http://...'

И просто верну немного пустое изображение с сервера. Я думаю, что он должен быть надежным, script будет блокироваться. BTW: приятно добавить временную метку, чтобы предотвратить кеширование.

Ответ 3

У нас есть случай, когда нам это нужно. Это страница отчета, которая требует серьезной памяти на сервере, поэтому мы хотели немедленно ее освободить, как только они покинули страницу. Мы создали набор фреймов и добавили обработчик выгрузки. Самый надежный способ - установить src изображения на освобождение script. Фактически мы использовали как разгрузку, так и onbeforeunload для кросс-браузерной совместимости. Он не работал в ночных клубах, но руководство было в порядке с этим.

Однако это не было моим предложенным решением. Я бы использовал подход с биением, который требует больше работы, но гораздо более надежный.

Ваша страница должна отправлять периодические запросы на пульс. Каждый запрос устанавливает последнее биение из страницы. Затем вам нужен поток, который запускается на сервере и очищает память, если последнее сердцебиение было слишком давно.

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

Ответ 4

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

Если вы хотите убедиться, что запрос AJAX сделал это, вам придется больше беспокоиться/использовать параметр async:false (например, это обсуждение), Но просто отправка - это быстрый бум и ваша операция.

Ответ 5

У меня был случай, когда мне нужно было только сообщать стороне сервера о выгрузке и не волновал ответ.

Если это ваше дело, вы можете ignore_user_abort, и тогда вы знаете, что это произойдет "надежно"