2010-09-14 2 views
4

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

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

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

Любые предложения? (приветствуются как решения php, так и js)

+0

Можем ли мы увидеть вашу попытку на PHP и javascript для вашей попытки jQuery. – RobertPitt

+0

В соответствии с руководством Jquery обновление страницы запускает 'unload' сначала: http://api.jquery.com/unload/, поэтому ваш семафор следует удалить при обновлении. Увидеть код будет лучше, согласно @RobertPitt – Fanis

ответ

0

Невозможно открыть один раз одним и тем же пользователем, я полагаю.

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

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

0

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

1

Вы можете попробовать с печенья:

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

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

+0

, или если вы используете HTML5, вы можете использовать веб-хранилище HTML5 на стороне клиента вместо файлов cookie :) – Joset

0

извините, ребята, вы правы! Немного кода поможет всем нам :) предположим, мой сценарий 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; 

В начале скрипта.php i put

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

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

  • нажмите на обновления
  • выгрузить событие не вызывается, потому что страница не полностью оставил
  • сценарий. РНР перегрузочные
  • чек в начале script.php терпит неудачу, потому что флаг = истина
  • script.php идет по ошибке
  • событие выгрузить вызывается, потому что страница остается и флаг = ложь
  • нажмите обновить
  • сейчас это работает!

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

+0

@mic Я думаю, что это не сработает. проблема обновления. – tom

+0

@OTZ Я думал то же самое! но как я могу отслеживать страницы? особенно закрытой страницы! и, опять же, как я могу отличить закрытую страницу от обновленной? – tom

+0

Можете ли вы лучше объяснить, что вы на самом деле собираетесь здесь? Позвольте мне посмотреть, понимаю ли я ... Пользователь приходит в script.php на вкладке Chrome. Вы не хотите, чтобы пользователь мог загружать скрипт.php на второй вкладке Chrome, правильно? Но в то же время вы хотите, чтобы пользователь мог обновить страницу? Кроме того, это касается проблем удобства использования или проблем безопасности? – BBonifield

Смежные вопросы