2011-12-12 3 views
15

여기가 저의 첫 번째 질문이며, 제가 올바르게 수행하고 있기를 바랍니다.Stateful Session Bean을 사용하여 사용자 세션을 추적하십시오.

Java EE 프로젝트에서 작업해야하기 때문에 시작하기 전에 간단한 작업을 수행하려고 노력하고 있습니다.

안녕하세요. 상태 보존 세션 빈입니다.

여기에 질문이 있습니다. SFSB을 사용하여 사용자 세션을 추적하려면 어떻게해야합니까? 내가 본 모든 예제는 SFSBHttpSession 속성으로 "넣는"결과로 끝납니다. 하지만 그 이유는 모르겠다! 콩이 STATEFUL 인 경우 왜 HttpSession을 사용해야합니까?

SFSB을 클라이언트에게 반환하는 EJB 컨테이너 태스크가 있습니까?

간단한 카운터 빈을 사용해 보았습니다. 세션을 사용하지 않으면 두 브라우저가 동일한 카운터 빈을 갖습니다 ("증가"를 클릭하면 두 값이 모두 변경됨). 세션을 사용하면 두 개의 다른 값을 갖습니다. 각 브라우저마다 Firefox의 "증가"를 클릭하고 Firefox의 bean에만 하나씩 추가합니다.

그러나 선생님은 SFSB "는 클라이언트와 대화 상태"를 유지하는 것이 말했다, 왜 그것은 단지 의 HttpSession 사용하지 않고 작동하지 않는 이유는 무엇입니까?

내가 대신 SLSB으로 그 일의 동일한 SFSB의 HttpSession를 사용하지 않는, 제대로 이해하면?

내 질문이 분명하고 내 영어가 가난하지 않기를 바랍니다.

편집 : 로그인 시스템에서 작업하고 있습니다. 모든 것이 잘되고 로그인을 완료하면 사용자의 데이터를 보여주는 프로필 페이지로 이동합니다. 하지만 페이지를 다시로드하면 데이터가 사라집니다. 로깅하는 동안 HttpSession을 추가하려고 시도했지만이 방법으로하면 로그 아웃 후에도 데이터가 유지됩니다!

답변

25

Stateful Session Bean (SFSB)은 웹 계층에서 아무 것도 모르는 순수한 비즈니스 빈이므로 웹 환경에서 HTTP 세션과 결합해야합니다.

전통적으로 EJB는 필수 모듈 인 자체 모듈 (EJB 모듈)에도 있어야하기 때문에 원하는 경우 웹 아티팩트에 액세스 할 수 없습니다. 이는 계층화 된 시스템의 한 측면입니다. 자세한 내용은 Packaging EJB in JavaEE 6 WAR vs EAR을 참조하십시오.

Stateful Session Bean의 원래 클라이언트는 스윙 데스크톱 응용 프로그램이었으며 이진 프로토콜을 통해 원격 EJB 서버와 통신했습니다. Swing 응용 프로그램은 프록시/스텁 객체를 통해 원격 Stateful Session Bean에 대한 연결을 얻습니다. 이 프록시에 내장 된 ID는 서버가 특정 SFSB와 연결할 수있는 종류의 ID입니다.이 프록시 객체를 유지함으로써 Swing 클라이언트는 반복적 인 호출을 할 수 있고 그것들은 같은 bean 인스턴스로 갈 것이다. 그러면 클라이언트와 서버간에 세션이 생성됩니다.

웹 응용 프로그램의 경우 브라우저가 Java EE 웹 응용 프로그램에 대한 초기 요청을하면 서버가 특정 HTTPSession 인스턴스와 연결할 수있는 JSESSIONID이됩니다. 이 JSESSIONID을 유지하면 브라우저가 각 추가 요청을 제공 할 수 있으며 이는 동일한 http 세션 서버 측을 활성화합니다.

이러한 개념은 매우 유사하지만 자동으로 서로 매핑되지 않습니다.

브라우저는 JSESSIONID 만 가져오고 모든 SFSB ID에 대해 알지 못합니다. Swing 애플리케이션과는 달리 브라우저는 자바 빈즈가 아닌 웹 페이지와 통신한다.

클라이언트의 요청을 특정 상태 저장 세션 빈에 매핑하는 경우 EJB 컨테이너는 SFSB 프록시를 통해 제공된 ID만을 고려합니다. 호출이 웹 모듈의 코드에서 발생했는지 알 수 없으며 실제로 HTTP 컨텍스트에 액세스 할 수 없거나 실제로 액세스 할 수 없습니다.

SFSB에 액세스하는 클라이언트 코드 인 웹 계층은 특정 프록시 참조를 '보류'해야합니다. 일반적으로 웹 레이어의 항목을 유지하면 HTTP 세션에 저장됩니다.

그러나이 자동 연결을 만들 수있는 CDI이라는 브리지 기술이 있습니다. CDI의 @SessionScoped으로 SFSB에 주석을 달고 CDI를 통해 SFSB에 대한 참조를 얻는 경우 (예 : @Inject 사용) SFSB를 수동으로 http 세션에 넣지 않아도됩니다. 그러나 CDI는 그 뒤에서도 정확하게이를 수행 할 것입니다.

뭔가

@SessionScoped 
public class SessionInfo implements Serializable{ 
    private String name; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

같은 (당신이 HttpSession에 해당하는 솔루션을 찾고있는 경우)

+0

멋진 대답, Arjan. 그러나, 나는 당신이 대답의 마지막 단락에서 @SessionScoped를 의미했다고 믿는다. –

+0

@ Joe.M 오류를 발견해 주셔서 고마워요. –