Как определить, если пользователь открывает две вкладки для одного сеанса? - PullRequest
18 голосов
/ 07 апреля 2011

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

Как это работает, так это то, что Шаг 1 требует, чтобы они заполнили свою информацию. При переходе к шагу 2 информация на шаге 1 будет сохранена в объекте сеанса. Когда они переходят на другие этапы, процесс повторяется. По окончании оформления заказа все данные затем сохраняются в базе данных.

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

Допустим, у них есть два экземпляра приложения, открытого на вкладке A и вкладке B. На вкладке A они вводят подробности на шаге 1 и переходят к шагу 2. Затем пользователь делает то же самое на вкладке B.

На последнем шаге, когда пользователь делает заказ, информация на вкладке A такая же, как на вкладке B.

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

Есть ли способ обнаружить и предложить пользователю сначала заполнить форму бронирования на вкладке А, когда он пытается открыть другой экземпляр на вкладке Б?

Ответы [ 4 ]

9 голосов
/ 07 апреля 2011

1. Та же проблема (и решение): https://sites.google.com/site/sarittechworld/track-client-windows

2.Вы можете отправить информацию по почте или GET

2 голосов
/ 07 апреля 2011

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

Мне интересно, могут ли помочь скрытые поля с метками времени в ваших формах. Хотя та же идея.

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

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

2 голосов
/ 07 апреля 2011

Конечно, вы можете добиться этого с помощью скрипта на стороне клиента.В JavaScript вы можете сгенерировать идентификатор окна, который может быть любым, если он гарантированно уникален.Пусть JS сделает Ajax-вызывающих абонентов конечной точкой на сервере, которая не делает ничего, кроме сравнения идентификаторов и сеанса.В любой момент, если у вас есть два разных значения «windowID», вы знаете, что они должны открываться окнами для одного и того же сеанса.

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

Для реализации на стороне сервера вам просто нужно отправить текущий идентификатор окна вместе со ссылкой или публикацией, чтобы сервер мог очистить идентификатор окна из сеанса.Однако все это не защитит пользователя от одновременного открытия сеанса Firefox и сеанса Chrome.

0 голосов
/ 12 апреля 2017

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

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

Однако такой подход имеет серьезные недостатки.Например, если пользователь закрывает и вкладку A, и вкладку B, а затем открывает новую вкладку C ... что происходит?С каким набором данных они должны повторно соединяться?

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

Вы можете сделать это через локальное хранилище, кстати.Если вы генерируете случайный идентификатор на клиенте и помещаете его в локальное хранилище с помощью вызова, подобного window.localStorage.setItem('window_id', <my_random_id_here>);, тогда вы можете проверить это значение при загрузке страницы.Если значение существует при загрузке страницы, у вас есть довольно четкий индикатор того, что открыто хотя бы одно другое окно.Вы должны будете убедиться, что удалили это значение при выгрузке страницы, иначе мертвые сеансы могут вызвать ложные срабатывания.

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