Обнаружение, если два окна браузера открыты для одного и того же сайта

Я пытаюсь обнаружить, если пользователь открывает мой сайт на одной вкладке, а затем открывает его на другой вкладке. Затем это должно показать предупреждение пользователю на вновь открытой вкладке.

Прямо сейчас я отправляю вызов ajax "keep alive" каждую секунду на сервер. Затем он регистрирует "последнее активное" время в базе данных с уникальным идентификатором. Когда загружается новая страница, он проверяет, был ли этот пользователь (идентифицированный идентификатором пользователя) активным в течение последних 2 секунд.

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

Q) Я собираюсь сделать это правильно или есть более простой способ сделать это? Я слышал, что Gmail и Facebook могут что-то делать, но я не могу найти функцию сайта, в которой они это делают.


Фактический код использует множество внутренних функций, поэтому общая идея:

Псевдокод:

Page load;
[index] PHP: Save tabsessionid, userid, datecreated, lastactive, phpsessionid into database;
[index] JS: Every second, send tabsessionid to keepalive.php
[keepalive] PHP: Check if another session exists in the last 2 seconds
[keepalive] PHP:        If exists -> Return "-1"; else -> return "1";
[keepalive] PHP: Update tabsessionid last active time.

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

Ответ 1

Вы должны сохранить версию контента, первоначально на 1, при каждом поданном изменении оно увеличивается. Перемещенные изменения должны включать номер версии, который сравнивается с текущим, и отмена отклоняется, если они не совпадают. Также возможно сделать ajax-вызовы для запроса текущей версии и предупредить пользователя, что его версия устарела.

Обновление sql должно выглядеть следующим образом:

UPDATE table SET .... WHERE id = :id AND version = :version

Затем проверьте затронутые строки, если это 0, было обнаружено совпадение. Таким образом, вы не столкнетесь с состоянием гонки.

Ответ 2

Это просто идея, над которой вам нужно работать:

javascript-переменные являются локальными для вкладки, куки файлы являются общими. Вы можете дать каждой вкладке идентификатор и передать его в ссылках и формах *. Этот идентификатор будет храниться в файле cookie как активный идентификатор вкладки. если вкладка находит, что у нее нет и установлен идентификатор, и там установлен активный идентификатор вкладки, он может использовать другой куки файл, чтобы спросить, есть ли еще такая вкладка с этим идентификатором или была закрыта (и, конечно, она должна регулярно проверять это ", спросить" cookie и ответ"). Точная реализация зависит от того, что вы хотите сделать.

Надеюсь, я объяснил себе, что я поняла.

EDIT:

* Там window.name свойство js, вы можете использовать его как идентификатор окна, и вам не нужно его пропускать.

Ответ 3

Я думаю, что u должен отправлять данные (возможно, простой запрос HEAD) на сервер из каждого окна с параметром, содержит идентификатор пользователя uid и идентификатор окна (случайный сгенерированный один раз при загрузке страницы) и проверять, существует ли такой же uid с несколькими идентификаторами окна;

Похоже, это только путь.

Ответ 4

Должен ли я сказать, что это неуместное решение любой проблемы?

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