Saya datang dengan solusi baru, yang memiliki sedikit overhead, tetapi tampaknya berfungsi sejauh prototipe. Asumsinya adalah bahwa Anda berada dalam lingkungan sistem terhormat untuk masuk, meskipun ini dapat diadaptasi dengan meminta ulang kata sandi setiap kali Anda berpindah tab.
Gunakan penyimpanan lokal (atau yang setara) dan peristiwa penyimpanan HTML5 untuk mendeteksi ketika tab browser baru telah mengalihkan pengguna mana yang aktif. Ketika itu terjadi, buat ghost overlay dengan pesan yang mengatakan Anda tidak dapat menggunakan jendela saat ini (atau nonaktifkan jendela untuk sementara waktu, Anda mungkin tidak ingin jendela menjadi begitu mencolok.) Saat jendela kembali fokus, kirim log permintaan AJAX pengguna kembali.
Satu peringatan untuk pendekatan ini: Anda tidak dapat memiliki panggilan AJAX normal (yaitu, panggilan yang bergantung pada sesi Anda) terjadi di jendela yang tidak memiliki fokus (misalnya jika Anda memiliki panggilan terjadi setelah penundaan), kecuali Anda secara manual membuat panggilan login ulang AJAX sebelum itu. Jadi sebenarnya yang perlu Anda lakukan adalah memeriksa fungsi AJAX Anda terlebih dahulu untuk memastikan localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id, dan jika tidak, login terlebih dahulu melalui AJAX.
Kondisi lainnya adalah balapan: jika Anda dapat beralih jendela cukup cepat untuk membingungkannya, Anda mungkin akan berakhir dengan urutan relogin1-> relogin2-> ajax1-> ajax2, dengan ajax1 dibuat di bawah sesi yang salah. Mengatasi ini dengan mendorong permintaan login AJAX ke dalam array, dan kemudian menyimpan dan sebelum mengeluarkan permintaan login baru, batalkan semua permintaan saat ini.
Gotcha terakhir yang harus diperhatikan adalah penyegaran jendela. Jika seseorang menyegarkan jendela saat Anda memiliki permintaan masuk AJAX aktif tetapi belum selesai, itu akan disegarkan atas nama orang yang salah. Dalam kasus ini, Anda dapat menggunakan acara beforeunload yang tidak standar untuk memperingatkan pengguna tentang potensi kekacauan dan meminta mereka untuk mengklik Batal, sementara itu menerbitkan kembali permintaan login AJAX. Maka satu-satunya cara mereka dapat merusaknya adalah dengan mengklik OK sebelum permintaan selesai (atau dengan tidak sengaja menekan enter / spacebar, karena OK - sayangnya untuk kasus ini - default.) Ada cara lain untuk menangani kasus ini, seperti mendeteksi penekanan F5 dan Ctrl + R / Alt + R, yang akan berfungsi dalam banyak kasus, tetapi dapat digagalkan oleh konfigurasi ulang pintasan keyboard pengguna atau penggunaan OS alternatif. Namun, ini adalah kasus yang sedikit rumit pada kenyataannya, dan skenario terburuk tidak pernah seburuk itu: dalam konfigurasi sistem kehormatan, Anda akan masuk sebagai orang yang salah (tetapi Anda dapat memperjelas bahwa hal ini terjadi dengan mempersonalisasi halaman dengan warna, gaya, nama yang ditampilkan secara mencolok, dll.); dalam konfigurasi kata sandi, tanggung jawab ada pada orang terakhir yang memasukkan kata sandi untuk keluar atau membagikan sesi mereka, atau jika orang ini sebenarnya adalah pengguna saat ini, maka tidak ada pelanggaran.
Tetapi pada akhirnya Anda memiliki aplikasi satu-pengguna-per-tab yang (mudah-mudahan) berfungsi sebagaimana mestinya, tanpa harus menyiapkan profil, menggunakan IE, atau menulis ulang URL. Pastikan Anda membuatnya jelas di setiap tab yang masuk ke tab tertentu itu, meskipun ...