2013-02-23 12 views
5

Wiem, że jest już wiele pytań na ten temat, ale wciąż nie znalazłem ostatecznej odpowiedzi. To, co chcę zrobić, to mieć użytkowników zapamiętywanych po zalogowaniu się przez 2 tygodnie lub do czasu wylogowania. Poniżej jest to, co moim zdaniem powinno się wydarzyć i zastanawiałem się, czy ktokolwiek z nieco większym doświadczeniem może mi powiedzieć, czy mam rację, czy nie.Sesje i pliki cookie do autologin w GWT

Użytkownik loguje się po raz pierwszy. Wywołanie RPC do serwera zwraca obiekt "UserInfo", który zawiera nowy identyfikator sesji. Aka na serwerze tak się dzieje i user jest zwracany:

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

Teraz po user jest zwracany musimy tworzyć cookies do przechowywania danych po stronie klienta. Czy mam rację, mówiąc, musimy cookie do identyfikacji bieżącego użytkownika, a drugi dla 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); 

Teraz, gdy użytkownik wraca do aplikacji w późniejszym terminie możemy sprawdzić cookie oraz (pod warunkiem, że istnieje i nie zostały usunięte z jakiegoś powodu takie jak wyraźne wylogować się z użytkownikiem) korzystać ze swoich wartości, aby sprawdzić ważność sesji poprzez RPC do serwera:

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

Teraz, zakładając, co zrobiłem do tej pory jest poprawna (co to trochę dłuższego strzału: P) moje prawdziwe pytanie brzmi: co dokładnie powinienem sprawdzić po stronie serwera checkSessionValidity(sessionID,username)?

Czy jest to po prostu przypadek pobrania użytkownika, który mam przechowywany na serwerze i porównania sessionID z sessionID Mam związane z użytkownikiem? Czy sprawdzam również, czy nie wygasł?

Wiem, że jest to długotrwałe i być może niezbyt dobrze sformułowane pytanie ... Staram się opanować to wszystko, więc wszelka pomoc jest bardzo mile widziana!

Pozdrawiam, Steve

Odpowiedz

4

Tak, to jest kluczowa rzecz do zrobienia.

Oto interesujący punkt omawiane na tym (zapisywanie identyfikatora sesji i nazwy użytkownika w DB)

rzucić okiem na to (oczywiście można sprawdzić je w impl class zamiast servlet)
how to check if a sessionId is valid in a servlet (java).

I tu jest doskonałym przykładem zarządzania sesją w GWT

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

Przeczytaj to również question on GWT, Cookies and webpage directing

+0

Hej człowieku bardzo dziękuję za odpowiedź, przykład sprawił, że sprawy stały się nieco jaśniejsze! Zastanawiam się tylko, czy w tym przykładzie, kiedy użytkownik się wylogowuje, usuwa użytkownika z sesji, ale nie unieważnia identyfikatora sesji, który jest przechowywany w bazie danych z użytkownikiem? Czy to też nie powinno być zrobione? – SteveCallender

+1

Zobacz mieszanie dwóch przykładów, albo musisz utrzymać sesję, albo zapisać identyfikator sesji w bazie danych. Nie musisz robić obu. –

+0

Ahh okay, rozumiem. Tak więc pod warunkiem, że sprawdzam, czy identyfikator sessionID przechowywany w Cookie przeciwko sessionID przechowywanej w DB Nie muszę utrzymywać zmiennych sesji? – SteveCallender