2009-06-04 4 views
6

SessionListener에서 요청 헤더에 어떻게 액세스합니까?HttpSessionListener에서 HttpServletRequest를 얻으려면 어떻게해야합니까?

현재 세션을 만들 때 현재 세션에서 시간 초과를 설정해야합니다. 타임 아웃은 HttpServletRequest의 헤더에 따라 달라야합니다. 나는 이미 새로운 세션의 생성과 파기를 기록하는 SessionListener (HttpSessionListener 구현)를 가지고 있으며 타임 아웃을 설정하는 가장 논리적 인 장소 인 것으로 보인다.

다음을 시도했지만 항상 ctx를 null로 설정합니다.

FacesContext ctx = FacesContext.getCurrentInstance(); 

답변

8

HttpSessionListener은 세션이 파괴되었음을 알리는 요청이 없을 때 호출되므로 요청에 대한 액세스 권한이 없습니다.

따라서 Filter 또는 Servlet은 요청을 검토하고 세션 시간 초과를 지정하는 것이 좋습니다.

1

(the API 참조) 할 수 없습니다. 요청을 통해 세션에 액세스 할 수 있지만 다른 방법으로는 액세스 할 수 없습니다.

동일한 세션에 대한 동시 요청이있을 수 있으므로 가능하지 않습니다.

+3

"동일한 세션에 대한 동시 요청이있을 수도 있으므로 가능하지 않습니다." 나는 동의하지 않는다! 하나의 요청만으로 "sessionCreated"가 시작된 세션이 생성됩니다. 이것은 스펙의 감독입니다 ... "sessionCreated"메소드의 경우 세션을 생성 한 요청을 찾을 수 있어야합니다! –

2
FacesContext ctx = FacesContext.getCurrentInstance(); 

JSF 컨텍스트는 요청 별이며 스레드 로컬입니다. 따라서이 메소드 호출은 아마도 JSF 컨트롤러 호출 (예 : FacesServlet.service) 외부에서 null을 반환합니다. 따라서 Faces 서블릿 매핑을 통과하지 않는 다른 스레드 및 요청.

JSF 메커니즘을 사용하여이 타임 아웃을 설정하는 것은 기술적으로 가능하다 - 당신은 여전히 ​​시간 제한을 설정 cast to the servlet API해야하지만 당신이 RENDER RESPONSE 후 세션을 확인하기 위해 phase listener를 사용할 수 있습니다. 위상 리스너의 장점은 faces-config (see spec) 또는 for specific views에 전역 적으로 등록 할 수 있다는 것입니다. META-INF/faces-config.xml이있는 JAR에 정의 된 전역 단계 수신기는 여러 WAR에 포함될 수 있으므로이 기능을 쉽게 다시 사용할 수 있습니다.

(또한 override how the session is provisioned to JSF 수 있지만, 작업의 양이 과도.)

일회성를 들어

하는 Filtererickson's suggestion 정말 간단합니다.

관련 문제