플레이 프레임 워크에서 세션에 객체 (문자열이 아님)를 저장하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1694828

문제

학교 프로젝트가 있고 Java를 사용해야합니다. 최근에 나는 Play Framework를 찾았고 그것을 사용하고 싶습니다. 빠른 시작하기에 쉽지만 세션에 문제가 생겼습니다.

Play는 본질적으로 무국적으로, 쿠키의 사용자에게 전체 세션을 보내고 다음 요청에 따라 수신하므로 세션에서 제한된 양의 데이터 만 허용합니다.

내가하고 싶은 것은 사용자 로그인시 DB에서 사용자 객체를 가져 와서 세션에 보관하는 것입니다. 그래서 템플릿에서 액세스 할 수 있습니다 (UI를 사용자 정의하기 위해 전화 해야하는 몇 가지 방법이 있습니다. ), 그러나 사용자 객체를 넣으면 재생은 Tostring 메소드를 호출하여 세션에 넣습니다.

권장 방법은 더 많은 양의 데이터를 캐시에 넣는 것이지만 템플릿에서 액세스하는 방법을 모르겠습니다 (@Beefore ontolen on the Method에서 메소드를 만들고 RenderArgs에 사용자를 추가 할 수 있다고 생각합니다. 나에게 청소). 또 다른 문제는 캐시가 수명이 제한되어 있으므로 내 객체가 사라질 수 있다는 것입니다.

이런 종류의 문제에 대한 경험이 있습니까?

Play와 함께 서버 측 세션을 사용하는 방법이 있습니까? 이 프로젝트에 대한 휴식 기능이 필요하지 않으므로, 내가 염려하는 한, 응용 프로그램은 상태를 저장할 수 있습니다 ...

도움이 되었습니까?

해결책

Java 직렬화를 사용하여 해시 맵을 파일 또는 데이터베이스로 직렬화하십시오. 사용자의 쿠키에 저장 한 고유 식별자 후 파일 또는 ID 열의 이름을 지정하십시오. 그런 다음 해시 맵을 직렬화하기 전에 해시 맵에 사용자 객체를 넣습니다. 이제 액세스 할 수있는 지속적인 매장이 있습니다. 프레임 워크가 사용자 객체 또는 기타 세션 정보를 잊어 버리면 해시 맵을 사로화 할 수 있습니다. 그런 다음 정적 헬퍼 메소드, static 객체 sessiondb.get (문자열 id, 문자열 키) 및 sessiondb.put (문자열 id, 문자열 키, 개체 값)을 작성하십시오. 이 방법을 수제 프레임 워크에서 사용하여 소규모 서버 팜에 세션 정보를 저장합니다. 물론 파일 시스템이 아닌 데이터베이스를 사용합니다.

다른 팁

나는 당신이보아야한다고 생각합니다

http://groups.google.com/group/play-framework/browse_thread/thread/3d6946ad0b00303b/188e1b272d91408d?lnk=gst&q=Store+Object+in+Session#188E1B272D91408D

여기서 검색 할 수도 있습니다

http://groups.google.com/group/play-framework

Google Groups의 Play Framework 토론 목록은 매우 활동적이며 일반적으로 최대 며칠 안에 응답을받습니다.

또 다른 옵션은 객체를 JSON으로 변환하는 것입니다. 나는 이것에 대한 간단한 유틸리티를 만들었고 Flexjson을 사용하여 객체를 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);
    }

}

참고 : 작업 후 청소를 관리하고 쿠키에 저장되므로 안전하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top