Я придумав нове рішення, яке має крихітні накладні витрати, але, здається, працює поки що як прототип. Одне припущення полягає в тому, що ви знаходитесь в системному середовищі честі для входу в систему, хоча це можна адаптувати, запитуючи пароль щоразу, коли ви переходите на вкладки.
Використовуйте localStorage (або еквівалент) та подію зберігання HTML5, щоб виявити, чи переключена нова вкладка браузера, який користувач активний. Коли це станеться, створіть накладку на привид із повідомленням, що ви не можете використовувати поточне вікно (або іншим чином відключити вікно тимчасово, можливо, ви не хочете, щоб воно було таким помітним.) Коли вікно повернеться до фокусу, надішліть реєстрацію запиту AJAX користувач повертається.
Одне застереження такого підходу: ви не можете мати звичайних дзвінків AJAX (тобто тих, які залежать від вашого сеансу), у вікні, яке не має фокусу (наприклад, якщо у вас дзвінок відбувся після затримки), якщо тільки ви вручну здійснюєте повторний дзвінок AJAX перед цим. Тож дійсно все, що вам потрібно зробити, - це спочатку перевірити функцію AJAX, щоб переконатися, що localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id, а якщо ні, спочатку увійдіть через AJAX.
Інша умова перегонів: якщо ви можете перемикати вікна досить швидко, щоб заплутати його, ви можете закінчити послідовність relogin1-> relogin2-> ajax1-> ajax2, при цьому ajax1 буде зроблений під час неправильного сеансу. Подолайте це, натиснувши запити AJAX для входу на масив, а потім на зберігання та перед тим, як надсилати новий запит на вхід, скасуйте всі поточні запити.
Остання зміна, на яку слід звернути увагу, - оновлення вікон. Якщо хтось оновлює вікно, поки у вас активний запит на вхід у AJAX, але не завершено, воно буде оновлено від імені невірної особи. У цьому випадку ви можете використовувати нестандартну подію перед завантаженням, щоб попередити користувача про потенційну суміш і попросити їх натиснути Скасувати, тим часом повторно видавши запит на вхід у AJAX. Тоді єдиний спосіб їх отримати - це натиснути кнопку "ОК" до завершення запиту (або випадково натиснувши клавішу введення / пробіл, тому що ОК - на жаль, для цього випадку - за замовчуванням.) Є й інші способи вирішення цього випадку, наприклад виявлення натискань F5 і Ctrl + R / Alt + R, які працюватимуть у більшості випадків, але можуть бути порушені переналаштуванням комбінації клавіш користувача або альтернативним використанням ОС. Однак це насправді є кращим випадком, і найгірші сценарії випадків ніколи не такі погані: у конфігурації системи честі ви входите в систему як неправильна особа (але ви можете зробити очевидним, що це так, персоналізуючи сторінки з кольорами, стилями, помітними іменами, тощо); у конфігурації пароля onus є останньою особою, яка ввела свій пароль, щоб вийти або поділитися своїм сеансом, або якщо ця особа фактично є поточним користувачем, порушень немає.
Але врешті-решт у вас є програма "один користувач на вкладку", яка (сподіваємось) просто діє як слід, без необхідності встановлювати профілі, використовувати IE або переписувати URL-адреси. Переконайтеся, що ви робите це очевидним у кожній вкладці, хто увійшов у цю конкретну вкладку, хоча ...