2016-05-11 2 views
0

Для пользователей, которые не хотят, чтобы их запоминали между сеансами на моем сайте, я генерирую временный токен сеанса и отправляю его как куки-файл клиенту, чтобы они были запомнился между веб-страницами на моем сайте.Как определить конец сеанса пользователя на веб-сайте для удаления токена сеанса

Файл cookie автоматически истекает в конце сеанса, поскольку это значение по умолчанию, но как определить конец сеанса сервера?

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

+0

Действительно ли требуется хранить сеансы на вашем сервере? Как насчет создания токена сеанса с использованием асимметричного шифрования (например, sha1) с известным ключом (например, идентификатором пользователя или именем пользователя) и солью и может быть временем. С каждым запросом вы можете проверить достоверность токена сеанса. Вам не нужно сохранять и поддерживать сеансы на своем сервере –

ответ

2

Концепция «сеанс» в «cookie-expires-at-end-of-session» на самом деле известна только в браузере. Из википедии:

Сеанс печенья, также известный как куки в памяти или транзиторной печенье, существует только во временной памяти, когда пользователь переходит на сайт [13]. Веб-браузеры обычно удаляют файлы cookie сеанса, когда пользователь закрывает браузер.

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

Один из способов добиться того, что вы хотите, - это отправить веб-страницу «heart-beat» на сервер, например. используя setTimeout в javascript для доступа к определенному URL каждые 10 секунд и передачи уникальной идентификации его «сессии» (в том смысле, в котором вы хотите, а не в cookie-сессии). Если это сердцебиение остановится, вы знаете, что ваша веб-страница была закрыта, или пользователь ушел от нее и т. Д., И вы можете сразу очистить свое состояние на стороне сервера.

Более подробно «URL-адрес биения» будет просто содержать список активных сеансов. Каждый доступ к этому URL-адресу будет обновлять отметку времени последнего действия указанного сеанса (например, http://..../heartbeat?id=12345). Таким образом, у вас есть список «самых последних штампов времени» для всех активных сеансов. Отдельный поток очистки затем будет запускаться через этот список один раз в то время, чтобы очистить те сеансы, которые не были обновлены за последние (10 ...) секунд.

Например (с использованием JQuery для доступа к URL, может сделать то же самое только с XMLHttpRequest ...)

<script> 
function heartBeat() { 
    setTimeout(function(){ 
     $.get("heartBeat?id="+mySessionId, function(data) { 
     // you may want to add sanity checks here, e.g. what with invalid session ids? 
     heartBeat(); // next call to heartBeat after OK response 
     } 
    }, 10000); 
} 
heartBeat(); // first call to heartBeat 
</script> 

Это будет вызывать URL сервера каждые 10 секунд (плюс ваша задержка ответа сервера).