Ho escogitato una nuova soluzione, che ha un po 'di spese generali, ma sembra funzionare fino a un prototipo. Un presupposto è che ti trovi in un ambiente di sistema d'onore per l'accesso, anche se questo potrebbe essere adattato richiedendo nuovamente una password ogni volta che cambi scheda.
Utilizzare localStorage (o equivalente) e l'evento di archiviazione HTML5 per rilevare quando una nuova scheda del browser ha cambiato l'utente attivo. Quando ciò accade, crea un overlay fantasma con un messaggio che dice che non puoi usare la finestra corrente (o altrimenti disabilita temporaneamente la finestra, potresti non volerlo essere così evidente.) Quando la finestra riprende lo stato attivo, invia una richiesta di registrazione AJAX l'utente rientra.
Un avvertimento a questo approccio: non è possibile effettuare chiamate AJAX normali (ovvero, che dipendono dalla sessione) in una finestra che non ha lo stato attivo (ad esempio se si è verificata una chiamata dopo un ritardo), a meno che prima fai una chiamata di re-login AJAX manualmente. Quindi davvero tutto ciò che devi fare è controllare prima la tua funzione AJAX per assicurarti che localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id e, in caso contrario, accedi prima tramite AJAX.
Un altro è le condizioni di gara: se puoi cambiare finestra abbastanza velocemente da confonderlo, potresti finire con una sequenza relogin1-> relogin2-> ajax1-> ajax2, con ajax1 creato nella sessione sbagliata. Per ovviare a questo, invia le richieste di accesso AJAX su un array, quindi sul palco e prima di emettere una nuova richiesta di accesso, annulla tutte le richieste correnti.
L'ultimo gotcha a cui cercare è l'aggiornamento della finestra. Se qualcuno aggiorna la finestra mentre hai una richiesta di accesso AJAX attiva ma non completata, verrà aggiornata nel nome della persona sbagliata. In questo caso è possibile utilizzare l'evento beforeunload non standard per avvisare l'utente del potenziale mixup e chiedere loro di fare clic su Annulla, nel frattempo riemettendo una richiesta di accesso AJAX. Quindi l'unico modo in cui possono sbagliare è facendo clic su OK prima che la richiesta venga completata (o premendo accidentalmente enter / barra spaziatrice, perché OK è - purtroppo per questo caso - il valore predefinito.) Ci sono altri modi per gestire questo caso, come rilevamento delle pressioni F5 e Ctrl + R / Alt + R, che funzionerà nella maggior parte dei casi ma potrebbe essere vanificato dalla riconfigurazione delle scorciatoie da tastiera dell'utente o dall'uso di un sistema operativo alternativo. Tuttavia, questo è un po 'un caso limite nella realtà, e gli scenari peggiori non sono mai così male: in una configurazione del sistema d'onore, verrai effettuato l'accesso come persona sbagliata (ma puoi rendere ovvio che questo è il caso personalizzando le pagine con colori, stili, nomi ben visibili, eccetera.); in una configurazione di password, l'onere è sull'ultima persona che ha inserito la propria password per essersi disconnesso o condiviso la propria sessione, o se questa persona è effettivamente l'utente corrente, allora non c'è violazione.
Ma alla fine hai un'applicazione per un utente per scheda che (si spera) agisce come dovrebbe, senza dover necessariamente impostare i profili, usare IE o riscrivere gli URL. Assicurati di renderlo ovvio in ogni scheda che è connesso a quella particolare scheda, sebbene ...