2013-02-23 19 views
5

so che ci sono già un sacco di domande su questo, ma non ho ancora trovato una risposta definitiva. Quello che sto cercando di fare è ricordare agli utenti dopo aver effettuato l'accesso per dire 2 settimane o finché non si disconnettono. Di seguito è quello che penso dovrebbe accadere e mi chiedevo se qualcuno con un po 'più di esperienza potrebbe dirmi se ho ragione o torto.Sessioni e cookie per l'autologin in GWT

L'utente accede per la prima volta. Una chiamata RPC al server restituisce un oggetto "UserInfo" che include con esso un nuovo sessionID. Aka sul server questo accade e user viene restituito:

user.setSessionId(getThreadLocalRequest().getSession().getId());

Ora, dopo user viene restituito dobbiamo creare i cookie per memorizzare i dati lato client. Ho ragione nel dire che abbiamo bisogno di un cookie per identificare l'utente corrente e un altro per il sessionID:

final long DURATION = 1000 * 60 * 60 * 24 * 14; //duration remembering login - 2 weeks 
Date expires = new Date(System.currentTimeMillis() + DURATION); 

String sessionID = user.getSessionId(); 
String username = user.getUsername(); 
Cookies.setCookie("sessionID", sessionID, expires, null, "/", false); 
Cookies.setCookie("username", username, expires, null, "/", false); 

Ora, quando l'utente torna al app in un secondo momento, controlliamo i cookie e (a condizione che esiste e non sono stati eliminati per qualche motivo, ad esempio un esplicito logout da parte dell'utente) utilizzare i loro valori per controllare sessione di validità tramite RPC al server:

String sessionID = Cookies.getCookie("sessionID"); 
String username = Cookies.getCookie("username"); 

    if (sessionID != null && username != null){ 
     AsyncCallback<UserInfo> callBack = new AsyncCallback<UserInfo>(){ 

      @Override 
      public void onFailure(Throwable caught) { 

       Window.alert("Error connecting to server."); 


      } 

      @Override 
      public void onSuccess(Boolean sessionValid) { 

       if (sessionValid) 
        loadInitialInterfaceForUser("username"); 
       else 
        loadLoginInterface(); 
      } 

     }; 

    loginSvc.checkSessionValidity(sessionID,username, callBack); 
    } 

    else 
     loadLoginInterface(); 

Ora, supponendo che quello che ho fatto finora è corretta (che è un po 'lungo: P) la mia vera domanda è cosa dovrei controllare sul lato server checkSessionValidity(sessionID,username)?

È semplicemente un caso di recuperare l'utente che ho memorizzato serveride e confrontando sessionID con lo sessionID che ho associato con l'utente? Verifico anche che non sia scaduto?

So che questa è una domanda lunga e forse non molto ben formulata ... Sto lottando per farmi girare la testa così ogni aiuto è molto gradito!

Cheers, Steve

risposta

4

Sì, che è una cosa fondamentale da fare.

Ecco un certo punto interessante discusso su quella (Memorizzazione di ID di sessione e il nome utente nel DB)

Dai un'occhiata a questo (naturalmente è possibile li controllano a impl class invece di servlet)
how to check if a sessionId is valid in a servlet (java).

E qui è un eccellente esempio di gestione di sessione in GWT

http://varuntayur.wordpress.com/2012/01/25/session-management-in-gwt

Leggi anche questo question on GWT, Cookies and webpage directing

+0

Ehi amico, grazie mille per la risposta, l'esempio ha reso le cose un po 'più chiare! Una cosa che mi chiedevo è, nell'esempio, quando l'utente si disconnette, rimuove l'utente dalla sessione ma non annulla l'ID di sessione che è memorizzato nel DB con l'utente? Non dovrebbe essere fatto anche questo? – SteveCallender

+1

Vedi che stai mixando i due esempi, o che devi mantenere nella sessione o devi memorizzare l'ID di sessione nel db. Non c'è bisogno di fare entrambe le cose. –

+0

Ahh okay capisco. Quindi, a condizione di controllare che il sessionID memorizzato nel cookie rispetto al sessionID memorizzato nel DB non devo mantenere le variabili di sessione? – SteveCallender

Problemi correlati