Уничтожьте сессию PHP на отъезде страницы

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

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

8
задан Kamran Ahmed 14 July 2013 в 09:22
поделиться

6 ответов

Делать что-то, когда пользователь уходит со страницы, является неправильным подходом, потому что вы не знаете, перейдет ли пользователь на совершенно другую страницу (скажем, contact.php ради аргумент), или он просто перейдет на следующую страницу abc.php и, как указал Borealid, вы не сможете этого сделать без 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 и , текущая страница отличается от текущей.

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

19
ответ дан 5 December 2019 в 06:52
поделиться

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

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

4
ответ дан 5 December 2019 в 06:52
поделиться

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

unset ($ _ SESSION ['varname']);

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

0
ответ дан 5 December 2019 в 06:52
поделиться

Я решаю проблему. Сначала возьмите текущий URL-адрес, затем отметьте, чтобы страница оставалась на текущем 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
ответ дан 5 December 2019 в 06:52
поделиться

Невозможно определить, когда пользователь переходит дальше со страницы, это просто невозможно надежным способом.

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

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

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

0
ответ дан 5 December 2019 в 06:52
поделиться

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

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

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

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

Затем вам нужно будет создать cronjob , который проверяет файл / БД на наличие сеансов старше 10–12 секунд и удаляет их вручную. Данные сеанса обычно хранятся в каталоге (указанном вашей конфигурацией PHP) в файле с именем sessions_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
ответ дан 5 December 2019 в 06:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: