2012-02-10 3 views
0

관리 대상 빈에 대해 ViewScopedSessionScoped 인 응용 프로그램을 개발했습니다. 사용자가 로그인해야하는 모든 모듈은 관리 빈이 SessionScoped이고 비 로그인 페이지가 ViewScoped입니다. 현재 문제는 세션이 기본적으로 30 분 후에 시간 초과 될 때 비 로그인 페이지가 commandButton이 서버에 요청을 보내지 않는 곳에서 비정상적으로 작동하고 해당 버튼에 대한 ajax 동작을 포함한 모든 버튼에도 문제가 발생한다는 것입니다. 페이지.jsf 및 관리 빈 뷰로 세션 시간 초과 후 a4j가 작동하지 않음

또한 세션이없는 것처럼 페이지가 왜 그렇게 행동하는지 알고 싶습니다. 사용자가 다른 페이지로 이동하지 않는 한 페이지를 보유 할 임시 세션을 만드는 ViewScoped 때문입니까?

나는 주어진 제안의 대부분을 시도했다.

+0

"a4j"라고 말하면 RichFaces의 ''구성 요소를 의미합니까? – BalusC

+0

@BalusC >> 예. – user1201055

답변

1

에서 발췌 BalusC's Communication in JSF 2.0

• @ ViewScoped : 브라우저 창/탭에 같은 JSF 뷰와 상호 작용하고로이 범위에서 콩만큼 살고있다. HTTP 요청에 따라 만들어지며 다른보기로 다시 게시하면 파기됩니다. GET 요청으로 뷰를 닫거나 닫을 때 즉시 파괴되지는 않지만 더 이상 일반적인 방법으로는 액세스 할 수 없습니다. JSF는 UIViewRoot # getViewMap()에 Bean을 관리 Bean 이름과 함께 키로 저장합니다.이 Bean 이름은 세션에 저장됩니다. 빈을 유지하려면 작업 (리스너) 메소드에서 null 또는 void를 리턴해야합니다. 동일한 브라우저 창/탭 (보기) 내의 후속 요청에서 상태를 유지해야하는 ajax, 데이터 테이블 및/또는 여러 렌더링 된/비활성화 된 속성을 사용하는보다 복잡한 양식에이 범위를 사용합니다.

@ SessionScoped :이 범위에있는 bean은 HTTP 세션이 존재하는 한 계속 존재합니다. 세션에서이 Bean과 관련된 첫 x 째 HTTP 요청시 생성되고 HTTP 세션이 + 효화 될 때 (또는 세션 맵에서 Bean을 수동으로 제거 할 때) 파기됩니다. JSF는 Bean을 관리 Bean 이름을 키로 사용하여 HttpSession의 속성으로 저장합니다. ExternalContext # getSessionMap()에서도 사용할 수 있습니다. 동일한 세션 내 모든 브라우저 창/탭 (보기)간에 안전하게 공유 할 수있는 순수 세션 범위 데이터에이 범위를 사용하십시오. 예를 들어, 로그인 한 사용자 등 사용자 별 설정 및 선택된 언어/로케일로 사용자 선호

ViewScoped 콩 차례로 사용자 세션에 저장된 UIViewRoot에 저장된

, 따라서 콩은 간접적으로 세션에도 저장됩니다. 세션이 만료되고 파괴 된 후에도 ViewScoped 빈이 파괴되고 상태를 예상하는 LoginBean의 코드에서 참조하는 경우 또는 상태 (예 : a4j)가 필요한 타사 구성 요소를 사용중인 경우, 그때 그것은 wierdness를 설명 할 수 있습니다.

귀하의 LoginBean에 대해 RequestScoped으로 전환하는 것이 좋습니다. 나는 어플 리케이션에 로깅하기 위해 ViewScoped backing beans가 필요한 상황을 경험하지 못했다.

+0

>> ViewScoped는 LoginBean 용이 아닙니다. 사용자가 로그인 할 필요가없는 페이지가 있습니다. Ajax 동작이 많은 검색 페이지와 같습니다. 그래서 ViewScoped를 사용했습니다. 설명대로 'ViewScoped 빈은 간접적으로 세션에도 저장됩니다. 세션이 만료되고 파괴되면 ViewScoped Bean도 파괴됩니다. ' 현재 내가 한 것은 자바 스크립트에서 세션 수를 조작하는 것입니다. 사용자가 30 분 후에 다시 페이지를 다시로드하도록하는 최선의 방법은 아닌 것 같습니다. – user1201055