2012-01-08 7 views
5

Mam aplikację GWT, która ma usługę RPC na zapleczu. Obecnie próbuję wdrożyć obsługę użytkowników, a jedyne pytanie, jakie pozostaje, to sposób, w jaki powinienem przechowywać dane sesji.Praca z sesjami w aplikacji GWT

mam przechowywania identyfikatora sesji, używając

getThreadLocalRequest().getSession().setAttribute("sid", "randomSIDgoeshere"); 

Więc pierwsze pytanie jest bardziej do apletów Javy niż GWT. Czy ten kod gwarancję, że następnym razem, kiedy nawiązać połączenie tak:

getThreadLocalRequest().getSession().getAttribute("sid"); 

Byłoby też być null (w przypadku, gdy zostanie wywołany przez użytkownika, który jeszcze nie zwiedziliśmy kawałek kodu, w którym jest ustawiony atrybut SID) lub dokładnie taki sam identyfikator SID, który już zapisałem dla tego użytkownika. Innymi słowy, czy te 2 elementy kodu są specyficzne dla użytkownika? (przez użytkownik mam na myśli pojedynczą przeglądarkę na jednym komputerze)

Drugie pytanie dotyczy przechowywania odwzorowań między identyfikatorami SID a dodatkowymi danymi, takimi jak identyfikator użytkownika. W przypadku, gdy mam kod jak poniżej:

public class MyGwtServiceImpl extends RemoteServiceServlet implements MyGwtService { 
    // SID to User ID mappings 
    private final Map<String, String> sessions = 
    new HashMap<String, String>(); 
    ... 
} 

To jest zagwarantowane, że sessions jest zawsze taki sam przedmiot dla wszystkich żądań i jego dane pozostają „żywe”, chyba że cała aplikacja jest zakończona? (Tomcat jest zatrzymany na przykład) Czy to normalne podejście lub powinienem utrzymywać wszystkie te mapowania na moim DB?

Odpowiedz

7

Po pierwsze:

Tak, to gwarantuje. Następnym razem, gdy zadzwonisz pod numer getThreadLocalRequest().getSession().getAttribute("sid"); przy następnym żądaniu, atrybut sid pozostanie tam. Należy jednak pamiętać, że jest to obszar zgłoszeń lokalnych, a zatem tylko żądania od tego samego użytkownika (przeglądarka + ip) będą udostępniać te informacje. Oznacza to, że:

Fakt:

  • Użytkownik A łączy się z Firefoksem
  • przechowywać losową wartość X z ID Y

Case Łéczy 1

  • użytkownikowi z Firefoxem
  • Możesz odzyskać X

Case 2

  • Użytkownik A łączy się z Google Chrome
  • Nie można pobrać wartość X

Case 3

  • Użytkownik B łączy z Firefoksem
  • Nie można wykonać retr Dopuszczalna wartość X

Tak, tak, zawartość sesji jest zależna od użytkownika. To, co istnieje w jednej sesji, nie oznacza, że ​​będzie istnieć w innej sesji.

Po drugie:

Nie, to nie jest gwarantowane. Chociaż w większości przypadków zostanie wywołany ten sam numer rejestracyjny, nie ma gwarancji, że zawsze będzie istnieć. Jeśli chcesz przetrwać z atrybutami w twoim servelet, musisz zadeklarować te atrybuty jako statyczne, a przez to, że atrybut statyczny nie będzie specyficzny dla użytkownika. Lub możesz przechowywać w ServeletContext

Mówię to, ponieważ różne implementacje (np. Glassfish) mogą zakończyć instancje, jeśli servelet nie jest wymagany przez długi czas (o ile pamiętam, nie jestem pewien tego (Glassfish kończący instancję)). Ale nie ma dokumentacji mówiącej, że gwarantuje ona, że ​​będzie to ta sama instancja, więc nie można zadeklarować niestatycznych atrybutów i współużytkować między różnymi instancjami.

+0

Dzięki, naprawdę świetna odpowiedź! – agibalov