Старайтесь не открывать одну и ту же страницу дважды - PullRequest
4 голосов
/ 15 сентября 2010

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

Последнее, что я попробовал, - это использование в окне jquery «load» и «unload». Он отлично работает, если я открываю ту же страницу в новом окне или новой вкладке, но также блокирует страницу, если я обновляю ее!

Я действительно не знаю, как идти дальше! Я подумал, что это простой пример использования семафора ... но я не могу правильно его кодировать.

Есть предложения? (оба решения php и js приветствуются)

Ответы [ 4 ]

1 голос
/ 15 сентября 2010

Вы можете попробовать с cookie:

  1. При первой загрузке страницы, файл cookie устанавливается (сервером для сеанса)
  2. В следующий раз, когда эта же страница загружается, она читает файл cookie
  3. Если файл cookie существует, не перезаписывать переменные сеанса

Не думаю, что браузер сможет определить разницу между обновлением и загрузкой в ​​другой вкладке / окне.

0 голосов
/ 15 сентября 2010

извините, ребята ... вы правы! Немного кода поможет всем нам :) предположим, что мой скрипт - script.php

в html script.php я положил

$(window).bind('load',
function(){
    $.post(PATHTOLOCK.php);
});
$(window).bind('unload',
function(){
    $.post(PATHTOUNLOCK.php);
});

В файле PATHTOLOCK.php я делаю это:

$_SESSION['flag']=true;

И в файле PATHTOUNLOCK.php я делаю это:

$_SESSION['flag']=false;

В начале script.php я поставил

if($_SESSION['flag']==true){
echo "error";exit;
}

Если я открываю script.php в двух окнах / вкладках, все работает нормально. Если я обновлю страницу, она не будет работать, потому что я предполагаю, что последовательность событий следующая:

  • нажмите на обновление
  • Событие unload не вызывается, потому что страница не полностью оставлена ​​
  • скрипт script.php перезагружается
  • проверка в начале script.php не удалась, потому что flag = true
  • script.php идет по ошибке
  • событие unload вызывается, потому что страница оставлена ​​и flag = false
  • нажмите на обновление
  • теперь работает!

и так далее ... каждые два обновления это работает!

0 голосов
/ 15 сентября 2010

Проблема в том, что у вас нет доступа к страницам конечного пользователя, которые в данный момент открыты в браузере. Таким образом, единственное решение для вас - продолжать отслеживать страницы, которые пользователь открыл / закрыл / переключил на другую страницу / и т.д. Даже это не идеально, поскольку пользователь может открыть другой процесс браузера. Так что нет идеального решения для этого.

0 голосов
/ 15 сентября 2010

Один и тот же пользователь не может открыть его более одного раза.

Как вы использовали события загрузки и выгрузки jquery?Мозговой штурм, как насчет использования load для установки в сеансе пользователя семафора, который удаляется unload.Конечно, я не уверен, что это событие сработает, даже если браузер зависнет или возникнет непредвиденная техническая проблема.В этом случае у вас может быть застрявший, для которого вам потребуется определенный тайм-аут или ожидание истечения времени ожидания сеанса.

Чтобы исправить это, возможно, после загрузки страницы есть таймер, который выполняется каждые 10секунд, в основном обновляя семафор вроде «Страница все еще открыта» вместе с текущей меткой времени.Если при загрузке семафор существует, но отметка времени старше 10 секунд, то пользователь обновляется.

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