2013-02-23 4 views
5

Je sais qu'il y a déjà beaucoup de questions à ce sujet mais je n'ai toujours pas trouvé de réponse définitive. Ce que je cherche à faire est de se souvenir des utilisateurs après leur connexion pour dire 2 semaines ou jusqu'à ce qu'ils se déconnectent. Voici ce que je pense qu'il devrait se passer et je me demandais si quelqu'un avec un peu plus d'expérience pourrait me dire si j'ai raison ou tort.Sessions et cookies à autologin dans GWT

L'utilisateur se connecte pour la première fois. Un appel RPC au serveur renvoie un objet 'UserInfo' qui inclut avec lui un nouvel identificateur de session. Aka sur le serveur et cela se produit user est retourné:

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

Maintenant, après user est retourné, nous devons créer des cookies pour stocker les données côté client. Ai-je raison de dire nous avons besoin d'un cookie pour identifier l'utilisateur en cours et un autre pour le idSession:

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); 

Maintenant, lorsque l'utilisateur revient à l'application à une date ultérieure, nous vérifions les biscuits et (à condition qu'ils existent et ont pas été supprimés pour une raison quelconque, comme un explicite déconnecterai de l'utilisateur) utilisent leurs valeurs pour vérifier la validité de la session via RPC au serveur:

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(); 

maintenant, en supposant que je l'ai fait jusqu'à présent est correct (qui est un peu long: P) ma vraie question est de savoir exactement ce que je devrais vérifier sur le côté serveur checkSessionValidity(sessionID,username)?

Est-ce simplement un cas d'aller chercher l'utilisateur que j'ai stocké Serverside et la comparaison avec le sessionIDsessionID j'ai associé à l'utilisateur? Est-ce que je vérifie également qu'il n'a pas expiré?

Je sais que c'est verbeux et peut-être pas question très bien rédigé ... Je me bats pour obtenir ma tête ronde si toute aide est la bienvenue!

Cheers, Steve

Répondre

4

Oui, qui est un élément clé à faire.

Voici un point intéressant discuté sur ce (stockage de l'ID de session et nom d'utilisateur dans DB)

Jetez un oeil sur ce (ofcourse vous pouvez les consulter en impl class au lieu de servlet)
how to check if a sessionId is valid in a servlet (java).

Et voici un excellent exemple de gestion de session dans GWT

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

Lire aussi ce question on GWT, Cookies and webpage directing

+0

Salut, merci beaucoup pour la réponse, l'exemple a rendu les choses un peu plus claires! Une chose que je me demandais est, dans l'exemple, lorsque l'utilisateur se déconnecte, il supprime l'utilisateur de la session, mais n'invalide pas le sessionID qui est stocké dans la base de données avec l'utilisateur? Cela ne devrait-il pas être fait aussi? – SteveCallender

+1

Voyez que vous mélangez les deux exemples, soit vous devez maintenir dans la session ou devez stocker l'ID de session dans la base de données. Ne pas faire les deux. –

+0

Ahh d'accord, je vois. Donc, à condition que je vérifie que le sessionID stocké dans le cookie contre le sessionID stocké dans la base de données, je ne dois pas maintenir les variables de session? – SteveCallender