$ _SESSION не распознается при повторном входе в систему после истечения времени ожидания - PullRequest
1 голос
/ 23 апреля 2011

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

//get info from database and if user is authorized, then redirect
session_start();
$_SESSION['authorized'] = $user;
$_SESSION['firstname'] = $first;
$_SESSION['lastname'] = $last;
$_SESSION['password'] = $pass;
$_SESSION['position'] = $position;
$_SESSION['email'] = $email;
header( "Location: index2.php" );

Затем на странице index2.php у меня вверху проверка авторизации:

session_start();
if(!isset($_SESSION['authorized'])){
header( "Location: denied_unauth.php" );
die();
}else{
//rest of page

Все работает как шарм.КРОМЕ ... если в течение 20 минут не происходит никаких действий, пользователи должны снова войти в систему. Index2.php использует jQuery для загрузки в него div, поэтому пользователи никогда не покидают index2.php.Если они щелкают, чтобы получить страницу на закрытом сайте после неактивности, вместо запрашиваемого div, они получают сообщение «Выйти из системы» и снова получают форму входа.Это тот же сценарий, что и приведенный выше, устанавливающий те же переменные сеанса и перенаправляющий их обратно на ту же самую страницу (index2.php), то есть на ту же страницу, с которой они входят - в основном, просто перезагрузив страницу.

Всякий раз, когда я проверяю это, index2.php не распознает новый сеанс.Он отправляет пользователей на "denied_unauth.php" каждый раз.Это говорит мне, что скрипт входа в систему работает, он распознает имя пользователя и пароль и отправляет пользователей на index2.php ... но когда страница перезагружается index2.php, сеанс не распознается.Я даже попытался добавить случайное число в конец URL "index2.php? somerandomnumber на случай, если это была проблема с кэшированием, но это не помогло.

Есть идеи?

РЕДАКТИРОВАТЬ: Чтобы было ясно, я не прошу способ ОСТАНОВИТЬ пользователя, вышедшего из системы. Я пытаюсь выяснить, почему, если новые переменные сеанса создаются во время сценария входа в систему, он не распознает их при перезагрузке страницы. Переменные сеанса создаются при первом входе в систему, поэтому я знаю, что часть скрипта работает. Но когда они снова возвращаются на страницу после повторной регистрации, это нераспознать новый $ _SESSION ['авторизованный'].

РЕДАКТИРОВАТЬ 2: Вот что происходит:

  1. Со страницы index.php, пользователь входит в систему. Форма входа создаетсеанс и перенаправляет заголовок на index2.php
  2. Страница index2.php проверяет, установлен ли сеанс, если нет, то выгоняет пользователя на страницу «отказано в доступе».
  3. Пользователь нажимает ссылки внутристраница index2.php для загрузки разделов вe main div
  4. Каждый файл, который загружается в основной div, проверяется, установлен ли сеанс.Если сеанс существует, то файл загружается, если срок действия сеанса истек, а не файл, он показывает пользователю форму входа в систему и просит их снова войти в систему (пока все это работает)
  5. Когдапользователь снова входит в эту форму, создается новый набор переменных сеанса.Я попытался установить новый сеанс или session_regenerate_id (), и ни один из них, похоже, не работает.
  6. Этот новый сеанс НЕ распознается index2.php, и он каждый раз выводит их.Я пытался как перенаправить прямо на index2.php после входа в систему, так и просто загрузить div, который они запрашивали в первую очередь, но в обоих случаях index2.php не видит, что сеанс установлен, и пользователь заканчивается настраница "отказано в доступе".

Ответы [ 5 ]

0 голосов
/ 25 апреля 2011

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

0 голосов
/ 23 апреля 2011

Один верный способ справиться с этим - создать ajax-скрипт сердцебиения, который вы загружаете в фоновом режиме каждые X минут, который требует только «прикосновения» к сеансу. Это предполагает, что у всех ваших пользователей будет включен JavaScript.

0 голосов
/ 23 апреля 2011

Я не уверен, что это будет работать, но если у вас нет доступа к файлу php.ini или .htaccess, вы можете использовать его после session_start ():

session_regenerate_id(true);

Вы также должны поместить это на страницу, с которой jquery загружает div.

0 голосов
/ 23 апреля 2011

Это проблема времени жизни сессии.Вы можете решить эту проблему двумя способами.вот описание:

  1. изменить файл php.ini.увеличьте session.gc_maxlifetime, по умолчанию это 1440, что означает 24 минуты.Вы можете увеличить это на секунду.
  2. Здесь второй способ без изменения файла php.ini.Вы можете установить время жизни сессии с помощью php, используя следующий код:

    ini_set ('session.gc_maxlifetime', 30 * 60);

    session_start ();

0 голосов
/ 23 апреля 2011

Время ожидания сеанса указано в файле php.ini:

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440

; Document expires after n minutes.
session.cache_expire = 180

Если вы не можете или не хотите изменять это глобально на сервере, попробуйте использовать файл .htaccess на Apache.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...