Как обнаружить, что та же страница уже открыта в другом окне в IE

Там какой-либо путь состоит в том, чтобы проверить, что моя страница не открыта на другой вкладке или окне в IE? Скажите, что у меня есть Page1 и пользовательские хиты "новое окно", которое откроет новое окно с той же открытой страницей. Таким образом, теперь существует два экземпляра страницы. Я хочу ограничить браузер, чтобы только иметь один экземпляр страницы, открытой в любой момент времени.

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

Не уверенный, что существует любой способ различать обновление страницы и новое открытое окно, вот почему я спрашиваю.

P.S. Это не для нормального веб-сайта, и я понимаю, что выполнение этого обычно было бы навязчивым и злым. Существуют веские доводы, чтобы сделать это здесь, как это - крупное веб-приложение.

5
задан Egor Pavlikhin 15 April 2010 в 00:07
поделиться

3 ответа

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

Итак, в основном:

  1. Вы добавляете сгенерированный токен к каждой ссылке (как часть строки запроса)
  2. Любой полученный запрос, не содержащий токена, может считаться недействительным.
  3. Генерируете новый токен при каждом запросе, так что в каждый момент времени действителен только 1 токен
4
ответ дан 14 December 2019 в 13:30
поделиться

Простой способ сделать это - использовать windowName

window.open(windowURL, windowName, windowFeatures); 

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

этот парень очень хорошо это объясняет. - http://www.joemarini.com/tutorials/tutorialpages/window1.php

2
ответ дан 14 December 2019 в 13:30
поделиться

Единственный способ, который я могу придумать, - это создать для каждой страницы файл cookie, идентифицирующий страницу и время ее доступа, со сроком действия всего несколько секунды или минуты (настройте по вкусу) и при загрузке вашего сайта (или при загрузке страницы), проверяя, существует ли этот файл cookie.

Псевдокод:

if (cookie exists) {

Page already loaded in another tab/window.

}

else {

write cookie

}

Возможно, вы можете использовать некоторую форму идентификатора сеанса, основанную на чем-то неуникальном. Возможно, с IP-адресом пользователя, именем пользователя и солью? Обратной стороной использования одного IP-адреса является то, что все пользователи за маршрутизатором совместно используют один и тот же адрес, преимущество связывания его с именем пользователя заключается в том, что он по крайней мере уникален для каждого пользователя, а соль используется для базовой безопасности (это может быть не совсем так. важно для вас, но это все еще кажется хорошей практикой), и предотвращает блокировку пользователя, потому что у него где-то «открыто другое окно».

Как и выше, проверьте, существует ли идентификатор сеанса, и, если нет, создайте его.

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


Отредактировано:

Чтобы справиться с необходимостью обновления страницы, я думаю, вы могли бы использовать onUnload (или jQuery .unload ) для уничтожения файла cookie, чтобы он удаляется для пользователя, покидающего / обновляющего страницу.

js, который запускает onUnload , может также использоваться для удаления переменной сеанса с помощью Ajax или просто cookie на стороне клиента.

0
ответ дан 14 December 2019 в 13:30
поделиться