2016-05-27 14 views
6

Sto sviluppando una webapp AngularJS che può essere aperta in diverse schede, vorrei sapere qual è il modo migliore per rilevare quando l'utente si disconnette in una di queste schede; Mi piacerebbe far apparire una finestra modale di login nelle altre schede. Stavo pensando di utilizzare un evento inviato dal server o tracciare l'esistenza del mio cookie del server. Non ho mai fatto qualcosa del genere, quindi mi sto chiedendo quali sono i pro ei contro delle mie opzioni o se mi manca qualche altro modo più intelligente per farlo.Rileva fine sessione tra le schede

EDIT: sul server ho ServiceStack (C#) che supporta Eventi Server-Sent out of the box

risposta

1

Un modo relativamente facile andare sta usando SignalR: quando l'utente si disconnette, inviare un messaggio a tutte le altre sessioni dello stesso utente.

+0

Non è SignalR a C# (o .NET) cosa specifica? –

+0

Sì, SignalR è specifico per asp.net. Se viene utilizzato un altro backend, è possibile utilizzare socket Web per fare la stessa cosa. (SignalR usa websocket sotto il cofano se il browser lo supporta). –

0

La risposta breve: non esiste un modo valido.

La risposta lunga:

Ci sono un sacco di modi di 'arresto di una sessione', così come diverse definizioni di cio 'che termina una sessione' anche mezzi.

modi per terminare la sessione includono:

  • Chiusura della scheda
  • Navigazione via
  • Chiusura del browser.
  • Blocco forzato del browser.
  • scollega internet
  • Modifica indirizzi IP
  • improvviso spegnimento
  • cronologia del browser pulizia

Ci sono due soluzioni comunemente usati ...

  • Avere il sondaggio cliente il server ogni 30-60 secondi per dire che sono vivo
  • Usa websocket, che in grado di rilevare la chiusura.
+0

Mi dispiace, forse non ero chiaro ... Se ho schede diverse e chiudo una di esse, la sessione "continua" sulle altre, , stavo chiedendo l'esplicita azione dell'utente di "logout". – wizzy

+0

A meno che tu non abbia il codice lì per interrompere le altre sessioni, dovrebbero continuare bene –

2

Gli eventi inviati dal server sono un ottimo modo per gestirlo. La gestione basata sugli eventi è buona perché consente di risparmiare risorse a differenza di altri metodi come (verifica dell'esistenza dei cookie), o il polling costante dei dati o il tipo di cosa heartbeat. Quindi qualsiasi metodo in cui il server può inviare messaggi all'app client per funzionare su qualcosa (nel tuo caso popup una modale che informa la sessione disconnessa) farà il meglio. Puoi anche usare socket.io che è ben progettato e può farlo facilmente.

2

È possibile controllare alcuni cookie o sessioni quando la scheda viene messa a fuoco. Se si effettua il logout in una scheda e si passa a un'altra, la scheda attiva diventa un evento onfocuse. Puoi controllare se qualche cookie di accesso o sessione è ancora lì.

Detect If Browser Tab Has Focus

penso che tu abbia problema simile.

3

Poiché si utilizza ServiceStack's Server Events, è sufficiente inviare una notifica quando un utente si disconnette.

Prima di tutto bisogna rilevare l'utente ha accesso dal attuazione del OnLogout Session or Auth Event, ad esempio:

public class MyAuthEvents : AuthEvents 
{ 
    public IServerEvents ServerEvents { get; set; } 

    public override void OnLogout(IRequest httpReq, 
     IAuthSession session, IServiceBase authService) 
    { 
     var channel = "home"; //replace with channel tabs are subscribed to 
     var msg = "..."; 
     ServerEvents.NotifyUserId(session.UserAuthId, "cmd.logout", msg, channel); 
    } 
} 

notificatrice da UserId invierà la notifica di diverse schede, così come i browser in cui l'utente è collegato in. Se desideri solo inviare notifiche a tutte le schede nel solo browser, puoi utilizzare l'API NotifySession(session.Id).

per registrare i tuoi AuthEvents Handler con ServiceStack è sufficiente registrarlo nel CIO, ad esempio:

container.RegisterAs<MyAuthEvents, IAuthEvents>(); 

quindi gestire la notifica cmd.logout nel vostro JavaScript ServerEvents Client, ad esempio:

$(source).handleServerEvents({ 
    handlers: { 
     logout: function (msg) { 
      //Show AngularJS dialog 
      $mdDialog.alert({ 
       title: 'Attention', 
       textContent: msg, 
       ok: 'Close' 
      }); 
     }, 
     //... Other custom handlers 
    } 
}); 
Problemi correlati