Я придумал новое решение, которое немного перегружено, но, похоже, работает как прототип. Одно из предположений заключается в том, что вы находитесь в системной среде чести для входа в систему, хотя это можно изменить, запрашивая пароль при каждом переключении вкладок.
Используйте localStorage (или эквивалентный) и событие хранилища HTML5, чтобы определить, когда новая вкладка браузера изменила, какой пользователь активен. Когда это произойдет, создайте призрачное наложение с сообщением о том, что вы не можете использовать текущее окно (или временно отключите окно, возможно, вы не захотите, чтобы оно было таким заметным). Когда окно восстанавливает фокус, отправьте запись AJAX-запроса пользователь вернулся.
Одно предостережение об этом подходе: у вас не может быть никаких обычных вызовов AJAX (то есть тех, которые зависят от вашего сеанса), происходящих в окне, которое не имеет фокуса (например, если у вас был вызов, произошедший после задержки), если только перед этим вы вручную делаете повторный вход в AJAX. Поэтому на самом деле все, что вам нужно сделать, это сначала проверить свою функцию AJAX, чтобы убедиться, что localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id, и если нет, сначала войдите в систему через AJAX.
Другой - это условия гонки: если вы можете переключать окна достаточно быстро, чтобы запутать его, вы можете получить последовательность relogin1-> relogin2-> ajax1-> ajax2, причем ajax1 выполняется в неправильном сеансе. Чтобы обойти эту проблему, отправьте запросы AJAX входа в массив, а затем onstorage и перед выполнением нового запроса входа прервите все текущие запросы.
Последнее, на что нужно обратить внимание - это обновления окна. Если кто-то обновит окно, когда у вас активен, но не выполнен запрос на вход в AJAX, он будет обновлен на имя не того человека. В этом случае вы можете использовать нестандартное событие beforeunload, чтобы предупредить пользователя о возможной путанице и попросить его нажать Отмена, в то же время повторно выполняя запрос входа в AJAX. Тогда единственный способ, которым они могут это испортить, - это нажать OK до завершения запроса (или случайно нажав Enter / пробел, потому что OK - к сожалению для этого случая - по умолчанию.) Есть другие способы обработки этого случая, например обнаружение нажатий F5 и Ctrl + R / Alt + R, которые будут работать в большинстве случаев, но могут быть сорваны из-за перенастройки сочетания клавиш пользователя или альтернативного использования ОС. Тем не менее, это немного крайний случай в реальности, и наихудшие сценарии никогда не бывают такими плохими: в конфигурации системы чести вы будете зарегистрированы как неправильный человек (но вы можете сделать это очевидным, если персонализируете страницы цветами, стилями, заметными именами, и т.д.); в конфигурации с паролем ответственность лежит на последнем человеке, который ввел свой пароль, чтобы выйти из системы или поделился своим сеансом, или, если этот человек фактически является текущим пользователем, нарушения не существует.
Но, в конце концов, у вас есть приложение «один пользователь на вкладку», которое (будем надеяться) просто работает как надо, без необходимости настраивать профили, использовать IE или переписывать URL-адреса. Убедитесь, что вы четко указываете на каждой вкладке, кто вошел в эту вкладку, хотя ...