LINUX.ORG.RU

Перехват события закрытия браузера

 


1

2

Добрый день.

Люди просят во что бы то ни стало вкрутить в сайт разлогинивание при закрытии браузера. Есть ли какое-то универсальное решение этой проблемы?

Установка пустого значения срока жизни куков не панацея, так как браузер не гарантированно прибивает сессию при закрытии.

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

Есть ещё вариант с неперывным пингом сервера, но очень не хочется гонять трафик.

★★

Типа того

function getUnixTimestamp () { /*...*/ }
function setCookie (name, value) { /*...*/ }
function getCookie (name) { /*...*/ }

var EXPIRES = 10;

setCookie ('presence', getUnixTimestamp ());
window.setInterval (function ()
{
    if (getUnixTimestamp () - getCookie ('presence') > EXPIRES)
        setCookie ('target', null);
    else
        setCookie ('presence', getUnixTimestamp ());

}, 1000);
metrokto ★★ ()
Ответ на: комментарий от arturpub

Фурифокс может восстановить сессию со всеми куками.

metrokto ★★ ()
Ответ на: комментарий от mm3

Нельзя полагаться на такое поведение.

И что, держать по вебсокету от каждого юзера только чтоб проверить?

Нельзя такого и я думаю вполне умышленно. Куки сессии как раз для авторизаци.

Kalashnikov ★★★ ()
Ответ на: комментарий от zz
To invoke this event, do one of the following:
Close the current window. 
Navigate to another location by entering a new address or selecting a Favorite. 
Click an anchor that refers to another document. 
Invoke the anchor.click method. 
Invoke the document.write method. 
Invoke the document.close method. 
Invoke the window.close method. 
Invoke the window.navigate or NavigateAndFind method. 
Invoke the location.replace method. 
Invoke the location.reload method. 
Specify a new value for the location.href property. 
Submit a form to the address specified in the ACTION attribute via the INPUT type=submit control, or invoke the form.submit method. 
Invoke the window.open method, providing the possible value _self for the window name. 
Invoke the document.open method. 
Click the Back, Forward, Refresh, or Home button.
metrokto ★★ ()

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

amomymous ★★★ ()

Спасибо всем за советы. Наверное пока уменьшу время сессии и вернусь к этому вопросу позже.

Hater ★★ ()
Ответ на: комментарий от Hater

вернусь к этому вопросу позже

Молодец, так держать по жизни.

anonymous ()

Если кого-то интересует чем всё закончилось: решили сделать следующий вариант. Каждые 2 секунд клиентом с любой страницы сайта посылается пинг запрос. В случае, если в течение минуты не было ни одного запроса, то сервер удаляет клиентскую сессию.

Кроме этого, существует дополнительная «виртуальная» сессия подлиннее. Т.е. если в течение 15 минут на сайте не было активности (кроме пинга), сервер удаляет сессию.

Hater ★★ ()
Ответ на: комментарий от anonymous

Да, именно так.

Поправка к моему предыдущему сообщению: каждые _20_ секунд.

Hater ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.