Уничтожить PHP-сессию при выходе из страницы - PullRequest
7 голосов
/ 05 июля 2010

Мне нужно уничтожить сеанс, когда пользователь покидает определенную страницу. Я использую session_destroy() в конце страницы, но это невозможно для меня, потому что моя страница имеет нумерацию страниц Моя страница: abc.php?page=1 или abc.php?page=2 или abc.php?page=3.

Итак, мне нужно уничтожить сеанс, когда пользователь покидает страницу abc.php. Как я могу сделать это без использования куки?

Ответы [ 7 ]

19 голосов
/ 05 июля 2010

Делать что-либо, когда пользователь уходит со страницы, - неправильный подход, потому что вы не знаете, перейдет ли пользователь на совершенно другую страницу (скажем, contact.php ради аргумента) или он / она просто перейдите на следующую страницу abc.php, и, как указал Бореалид, без JS это сделать невозможно. Вместо этого вы можете просто добавить проверку и посмотреть, приходит ли пользователь из abc.php:

Во-первых, в вашем файле abc.php установите уникальную переменную в массиве $ _SESSION, которая будет действовать как отметка о том, что пользователь был на этой странице:

$_SESSION['previous'] = basename($_SERVER['PHP_SELF']);

Затем добавьте это на всех страницах, перед тем как вывести какие-либо данные, чтобы проверить, пришел ли пользователь из abc.php:

if (isset($_SESSION['previous'])) {
   if (basename($_SERVER['PHP_SELF']) != $_SESSION['previous']) {
        session_destroy();
        ### or alternatively, you can use this for specific variables:
        ### unset($_SESSION['varname']);
   }
}

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

Надеюсь, я смог это четко объяснить.

4 голосов
/ 05 июля 2010

Для запуска, когда пользователь на самом деле покидает страницу, вы должны использовать Javascript для отправки асинхронного запроса обратно на сервер.Сервер не может магическим образом узнать, что пользователь «покинул» страницу.

См. http://hideit.siteexperts.com/forums/viewConverse.asp?d_id=20684&Sort=0.

1 голос
/ 04 ноября 2011

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

<p>To access my website please Login:</p>
<form name='login' action="./PHP_html/PHP/login.php" method='post'>
Username: <input type='text' name='username' /><div><?php print $_SESSION['baduser']; $_SESSION['baduser'] = "";?></div><br />
<div style="padding-left: 4px">Password: <input type='password' name='password' /><div><?php print $_SESSION['badpass']; $_SESSION['badpass'] = "";?></div></div>
<input type='submit' value='Login' /> or you can <a href="./Terms.php">Register</a>

Я не знаю, помогает ли это вообще, но это сработало для меня.

Кроме того, спасибо всем, кто пишет на таких сайтахэто, чтобы помочь тем из нас, кто еще учится.

0 голосов
/ 05 июля 2010

Бореалид заслуживает похвалы за указание на самое элегантное решение.

Более хитрым решением является сохранение iframe на странице, которая указывает на другую страницу «монитора», которая обновляется каждые несколько секунд. Это можно сделать без JavaScript, используя:

<meta http-equiv="refresh" content="10">

Обновляет страницу монитора каждые 10 секунд. Когда это происходит, страница монитора может записывать время (перезаписывая ранее записанное время) и идентификатор сеанса где-либо на сервере (БД или файл).

Затем вам нужно будет создать cronjob , который проверяет файл / БД на наличие сессий, возраст которых превышает 10 ~ 12 секунд, и удаляет их вручную. Данные сеанса обычно хранятся в каталоге (указанном вашей конфигурацией PHP) в файле с именем sess_the-session-ID. Вы можете использовать функцию PHP следующим образом:

function delete_session($sessId) {
    $sessionPath = session_save_path();
    // you'll want to change the directory separator if it's a windows server
    $sessFile = "$sessionPath/sess_$sessId";
    if (file_exists($sessFile) && unlink($sessFile)) return true;
    return false;
}
0 голосов
/ 05 июля 2010

Вы не можете сказать, когда пользователь перемещается на от со страницы, это просто невозможно каким-либо надежным способом.

Лучшее, что вы можете сделать, - это использовать работу куки. При запуске сеанса вы отправляете клиенту файл cookie, который идентифицирует клиента при каждом последующем посещении и, следовательно, активирует соответствующий сеанс. Клиент должен отправить эту идентификацию при последующих посещениях, а клиент должен «забыть» свою идентификацию.

Вы можете поручить клиенту отправлять cookie только для определенных страниц, и вы можете дать ему указание забыть cookie при закрытии браузера (со сроком жизни 0). Это можно установить с помощью session_set_cookie_params.

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

0 голосов
/ 05 июля 2010

Я решаю проблему. Сначала возьмите текущий URL-адрес, затем chk, чтобы страница оставалась на текущем URL-адресе. Если страница не находится в текущем URL-адресе, то уничтожьте сеанс.

$url = "http" . ((!empty($_SERVER['HTTPS'])) ? "s" : "") . "://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$page_name="abc.php";      
if (!preg_match("/$page_name/",$url)) 
 {
  session_destroy();
 } 

Но этот код следует использовать на других страницах. Потому что http - это процессы без сохранения состояния, поэтому невозможно найти, когда пользователь покинет страницу.

0 голосов
/ 05 июля 2010

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

unset($_SESSION['varname']);

Для всего сайта вы можете использовать session_destroy();

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