Сессия никогда не должна заканчиваться сама - PullRequest
14 голосов
/ 25 августа 2009

Я использую функцию входа в систему на моем сайте с сеансом. Мой сеанс истекает через несколько минут, независимо от того, вышел ли пользователь из системы или нет. Теперь я хочу, чтобы срок действия сессии истек только после выхода пользователя из системы. Если пользователь не выходит из своей учетной записи, а затем возвращается через 2-3 дня, даже в этом случае он должен появиться в системе.

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

Как я могу это сделать?

В частности, это правильный способ сделать это?

session_cache_expire(0);
session_start();

Ответы [ 3 ]

26 голосов
/ 25 августа 2009

В этой ситуации часто используется решение:

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

Таким образом:

  • у вас нет тысяч «активных» сеансов без уважительной причины.
  • Вы придерживаетесь стандартного способа работы сессий

И у вас есть преимущество «никогда не выходить из системы», по крайней мере, с точки зрения пользователя.

Также обратите внимание, что в «обычных» сеансах cookie, содержащий идентификатор сеанса, будет удален, когда пользователь закроет свой браузер, поэтому он будет отключен, независимо от того, как долго будет длиться сеанс.
С предложенным мною решением вы сами определяете, как долго куки должны оставаться на компьютере пользователя; -)


Это означает, однако, что когда пользователь выходит из системы вручную, вы, конечно же, должны удалить и его сеанс, и cookie - так что он не сразу повторно войдет в систему.


Конечно, вы должны быть осторожны с тем, что вы установили в куки: куки не совсем безопасны, поэтому, например, не храните в них пароль; -)


На самом деле, этот способ работы - это то, как часто работает функция «помни меня»; за исключением того, что здесь ваши пользователи не должны будут ставить флажок, чтобы активировать "запомнить меня"; -)


Если у вас нет времени на разработку такого рода вещей, довольно быстрый и грязный способ - это использовать какой-либо Ajax-запрос на всех ваших страницах, который просто «пингует» страницу PHP на сервере - это сохранит сеанс активен (но это не совсем хороший способ сделать что-то: у вас по-прежнему будет много сеансов на сервере, у вас будет много бесполезных запросов ... и это будет работать только до тех пор, пока пользователь этого не сделает закройте его браузер).

3 голосов
/ 25 августа 2009

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

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

0 голосов
/ 25 августа 2009

Вы удаляете свои куки во время тестирования? Включены ли куки? Вы уничтожаете сеанс где-то в вашем коде?

Также см. Мой ответ на другой пост: Быстрый вопрос о сессиях в PHP , в котором объясняется, как оставаться в системе. Просто не выполняйте задание cronjob / запланированное, если вы хотите, чтобы пользователь оставался в системе. навсегда.

...