2009-11-07 18 views
11

Mam projekt dla szkoły i muszę korzystać z Javy. Ostatnio znalazłem framework do gry i chcę spróbować go użyć. Jest to dość łatwe do szybkiego uruchomienia, ale natrafiłem na problem z sesją.Jak przechowywać obiekt (nie ciąg) w sesji w strukturze gry?

bezpaństwowcem Będąc z natury, zabawy wysyła całą sesję użytkownika w pliku cookie i otrzymuje go na następne żądanie, co pozwala jedynie ograniczoną ilość danych w sesji.

Co chcę zrobić, to pobrać obiekt użytkownika z bazy danych przy logowaniu użytkownika i przechowywać go w sesji, aby uzyskać do niego dostęp z szablonów i tak dalej (mam kilka metod w klasie użytkownika, które muszę wywołać aby dostosować interfejs użytkownika), ale jeśli ustawię obiekt użytkownika, odtwarzam wywołania jego metodę toString i umieszczam ją w sesji.

Zauważyłem, że zalecanym sposobem jest umieszczenie większej ilości danych w pamięci podręcznej, ale nie wiem, jak uzyskać do niego dostęp z szablonu (Chyba mógłbym zrobić metodę z adnotacją @Before i dodać użytkownika do renderArgs, ale to nie wydaje mi się zbyt czysty). Innym problemem jest to, że pamięć podręczna ma ograniczony czas życia, więc mój obiekt może zniknąć.

Czy ktoś ma doświadczenie z tego rodzaju problemami?

Czy istnieje sposób korzystania z sesji po stronie serwera podczas gry? Nie potrzebuję funkcji REST dla tego projektu, więc, o ile mi wiadomo, aplikacja może zapisać stan ...

Odpowiedz

3

Użyj serializacji Java do serializacji Hashmap do pliku lub do bazy danych. Nazwij kolumnę pliku lub identyfikatora po unikalnym identyfikatorze przechowywanym w pliku cookie użytkownika. Następnie umieść obiekt User w mapie mieszającej przed serializacją mapy mieszającej. Teraz masz stały sklep, do którego masz dostęp. Kiedy framework zapomni o obiekcie użytkownika lub jakiejkolwiek innej informacji o sesji, możesz deserializować mapę Hashmap. Następnie napisz kilka statycznych metod pomocniczych, static Object SessionDB.get (String id, String key) i SessionDB.put (String id, String key, Object value). Używam tej metody w moim domowym środowisku do przechowywania informacji o sesji w małej farmie serwerów. Oczywiście używam bazy danych, a nie systemu plików.

1

Innym rozwiązaniem jest przekształcenie obje cts do JSON. Stworzyłem prosty Util i użyłem FlexJSON do serializowania moich obiektów w JSON.

import play.Logger; 
import play.mvc.Http; 
import play.mvc.Http.Session; 
import flexjson.JSONDeserializer; 
import flexjson.JSONSerializer; 

public class SessionManager { 

private static JSONSerializer s = new JSONSerializer(); 

    public static void addSession(String key, Object value) { 

     if(value != null) { 
      Session session = Http.Context.current().session(); 
      session.put(key, s.deepSerialize(value)); 
     } else { 
      Logger.info("Value for " + key + " is null"); 
     } 
    } 

    public static <T> T get(String key) { 

     Session session = Http.Context.current().session(); 
     final String value = session.get(key); 

     if (value == null) { 
      return null; 
     } 

     return new JSONDeserializer<T>().deserialize(value); 
    } 

} 

UWAGA: Będziesz musiał zarządzać sprzątaniem po pracy i pamiętaj, że skoro jest ono przechowywane w pliku cookie, nie jest tak bezpieczne.

Powiązane problemy