Tôi đã đưa ra một giải pháp mới, có một chút chi phí nhỏ, nhưng dường như đang hoạt động như một nguyên mẫu. Một giả định là bạn đang ở trong môi trường hệ thống danh dự để đăng nhập, mặc dù điều này có thể được điều chỉnh bằng cách lấy lại mật khẩu bất cứ khi nào bạn chuyển tab.
Sử dụng localStorage (hoặc tương đương) và sự kiện lưu trữ HTML5 để phát hiện khi tab trình duyệt mới đã chuyển đổi người dùng nào đang hoạt động. Khi điều đó xảy ra, hãy tạo lớp phủ ma với thông báo cho biết bạn không thể sử dụng cửa sổ hiện tại (hoặc tạm thời tắt cửa sổ, bạn có thể không muốn nó dễ thấy như vậy.) Khi cửa sổ lấy lại tiêu điểm, hãy gửi nhật ký yêu cầu AJAX người dùng quay lại
Một lưu ý cho cách tiếp cận này: bạn không thể có bất kỳ cuộc gọi AJAX bình thường nào (nghĩa là các cuộc gọi phụ thuộc vào phiên của bạn) xảy ra trong một cửa sổ không có tiêu điểm (ví dụ: nếu bạn có một cuộc gọi xảy ra sau khi trì hoãn), trừ khi bạn thực hiện thủ công cuộc gọi đăng nhập lại AJAX trước đó. Vì vậy, thực sự tất cả những gì bạn cần làm là kiểm tra chức năng AJAX của bạn trước để đảm bảo localStorage.c hiệnly_logged_in_user_id === window.yourAppNameSpace.user_id và nếu không, hãy đăng nhập trước qua AJAX.
Một điều kiện khác là điều kiện chủng tộc: nếu bạn có thể chuyển đổi các cửa sổ đủ nhanh để gây nhầm lẫn, bạn có thể kết thúc bằng một chuỗi relogin1-> relogin2-> ajax1-> ajax2, với ajax1 được thực hiện dưới phiên sai. Giải quyết vấn đề này bằng cách đẩy các yêu cầu AJAX đăng nhập vào một mảng, sau đó lưu trữ và trước khi đưa ra yêu cầu đăng nhập mới, hủy bỏ tất cả các yêu cầu hiện tại.
Gotcha cuối cùng cần chú ý là làm mới cửa sổ. Nếu ai đó làm mới cửa sổ trong khi bạn đã kích hoạt yêu cầu đăng nhập AJAX nhưng chưa hoàn thành, nó sẽ được làm mới bằng tên của người sai. Trong trường hợp này, bạn có thể sử dụng sự kiện tải trước không chuẩn để cảnh báo người dùng về hỗn hợp tiềm năng và yêu cầu họ nhấp vào Hủy, trong khi phát lại yêu cầu đăng nhập AJAX. Sau đó, cách duy nhất họ có thể làm hỏng nó là bằng cách nhấp vào OK trước khi yêu cầu hoàn thành (hoặc bằng cách vô tình nhấn enter / spacebar, vì OK là - không may cho trường hợp này - mặc định.) Có nhiều cách khác để xử lý trường hợp này, như phát hiện các lần nhấn F5 và Ctrl + R / Alt + R, sẽ hoạt động trong hầu hết các trường hợp nhưng có thể bị cản trở bởi cấu hình lại phím tắt người dùng hoặc sử dụng hệ điều hành thay thế. Tuy nhiên, đây là một chút trường hợp cạnh trong thực tế, và các trường hợp xấu nhất không bao giờ tệ đến thế: trong cấu hình hệ thống danh dự, bạn đã đăng nhập sai người (nhưng bạn có thể thấy rõ rằng đây là trường hợp bằng cách cá nhân hóa các trang với màu sắc, kiểu dáng, tên hiển thị nổi bật, Vân vân.); trong cấu hình mật khẩu, trách nhiệm thuộc về người cuối cùng đã nhập mật khẩu của họ để đăng xuất hoặc chia sẻ phiên của họ hoặc nếu người này thực sự là người dùng hiện tại, thì không có vi phạm.
Nhưng cuối cùng, bạn có một ứng dụng một người dùng trên mỗi tab (hy vọng) chỉ hoạt động như bình thường, mà không nhất thiết phải thiết lập hồ sơ, sử dụng IE hoặc viết lại URL. Hãy chắc chắn rằng bạn làm cho nó rõ ràng trong mỗi tab được đăng nhập vào tab cụ thể đó, mặc dù ...