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
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
Zobacz mieszanie dwóch przykładów, albo musisz utrzymać sesję, albo zapisać identyfikator sesji w bazie danych. Nie musisz robić obu. –
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