2011-01-27 4 views
1

내 응용 프로그램에서 사용자가보고있는 현재 페이지를 기반으로 일부 잠금/잠금 해제 기능을 만들었습니다. 사용자는 페이지를 볼 수 있으며 내 데이터베이스에 저장된 잠금을 가져오고, 잠금을 해제하고 데이터베이스가 업데이트 될 때 내비게이션을 수행합니다.JSF - 사용자가 브라우저 창을 종료했을 때 감지

사용자가 로그 아웃하지 않고 브라우저 창을 닫을 때 상황을 처리하려고합니다. 그들은 여전히 ​​자물쇠를 잡고있을 것이고 내가 풀어 줘야하고 데이터베이스 호출이 필요하다.

Spring 또는 다른 것을 사용하는 JSF 애플리케이션에서이 문제를 처리 할 수있는 방법이 있습니까?

나는 javascript 함수 onbeforeunload를 알고 있지만 데이터베이스를 업데이트 할 수있는 Java 메서드를 호출해야합니다.

답변

1

unloadbeforeunload 이벤트는 해당 이벤트에서 발생하는 모든 Ajax 요청이 서버에 성공적으로 도달 할 것이라는 보증이 없기 때문에 여기에서 도움이되지 않습니다. 더 자주는 아니지만 이것은 그렇지 않습니다.

가장 신뢰할 수있는 방법은 서버 쪽 세션 수명을 매우 짧게 유지하는 것입니다 (예 : 1 분을 선택하고 사용자가 실제 시간 (최대 세션 시간 초과) 인 개 이상 비활성 상태가 될 때까지 매분 (최소 몇 초) 동안 서버와 동일한 세션 내에서 폴링하는 페이지에 ajax 폴러를 도입합니다. JavaScript 키보드 (keyup) 및 마우스 (click) 이벤트를 수신하여 사용자 활동을 테스트 할 수 있습니다.

+0

사용자가 브라우저 창을 종료 한 경우 현재 사용자의 세션에 있기 때문에 손실 된 아약스 폴러 상태가 아닙니다. 이것은 올바른 가정이 아니라면 모든 것이 어떻게 작동하는지에 대한 지식이 부족할 수도 있습니다. @BalusC – medium

+0

폴러는 세션을 활성 상태로 유지합니다. 세션 수명이 짧으면 마지막 폴링 후 1 분이 지나면 만료됩니다. 사용자가 페이지를 닫으면 폴러가 중지되고 세션이 만료됩니다. 사실, 최대 1 분의 간격 기간이 있지만 얻을 수없는 것보다 좋습니다. – BalusC

+0

@PreDestroy는 어때요?이 상황에서 유용할까요? –

0

현재 두 개의 창 응용 프로그램에서 작업 중이며 창이 닫힐 때를 감지해야합니다.

내 JSF 애플리케이션은 ICEfaces를 사용합니다. ViewScoped 빈에 대한 @WindowDisposed 주석을 제공합니다. 이 주석을 사용하면 윈도우가 닫힐 때 ViewScoped 빈의 @PreDestroy 메소드가 호출됩니다.

나는 내 페이지에 viewScoped 빈에 바인딩 된 h:inputHidden 태그를 포함 시켰으며 이는 창 닫기 및 서버 측 코드 실행을 탐지하는 측면에서 효과적입니다.

관련 문제