문제

DB 백엔드의 모든 사용자에 대해 소유자가 사이트에서 소비 된 시간 (로그인/로그 아웃)을 추적 할 수 있기를 원하는 회원 기반 사이트를 수정하고 있습니다. 로그인은 쉽습니다. 입력 지점 (로그인 양식)이 있으며 결과적으로 로그인은 데이터베이스가 발생하자마자 데이터베이스에 던져 질 수 있습니다.

그러나 사용자가 '로그 아웃'을 클릭하여 솔루션을 남기고있는 것을 명시 적으로 알려주지 않으면 로그 아웃은 약간 까다 롭습니다. 진짜 로그 아웃을 클릭하십시오?). 한 가지 가능성 (사이트에서 총 시간을 추적하는 측면에서)은 데이터베이스에 각 Pageload를 등록하고이를로드 한 사용자와 연결하는 것입니다. 그 문제는 사이트가 멤버십 기반 비디오 전달 사이트 (생각하는 것이 아님)이며 마지막 페이지 뷰는 20 분 또는 30 분 비디오가 될 것입니다. 우리는 마지막 페이지에서 보낸 시간을 캡처해야합니다.로드 된 시간뿐만 아니라.

나는 두 가지 가능한 솔루션을 생각했는데, 그 어느 것도 그렇게 우아하지 않습니다. 첫 번째는 JavaScript를 통해 모든 '언로드'이벤트를 덫을 놓고 'logout.php'에 호출을 등록하는 것입니다 (xmlhttprequest 또는 페이지가 언로드 되 자마자 죽지 않는 것으로 가정합니다). 문제는 내부 링크가 언로드 이벤트로 등록하므로 링크를 클릭하면 사용자를 로그 아웃 할 수 있습니다 ( '언로드'핸들러에서 플래그를 확인하고 모든 내부 링크가 해당 플래그를 설정할 수 있습니다. 동적으로, 그러나 약간 kludgy). 다른 접근법에는 60 초마다 DB를 핑하는 간격을 설정하는 것이 포함되며, 이는 사용자가 여전히 사이트에 있음을 알 수있게 한 다음 해당 세션의 총 길이를 파악하기 위해 사용자의 이력을 끌어 올릴 때 수학을 수행합니다. ; 그것은 또한 일종의 해킹처럼 보입니다. 또한 이러한 솔루션 중 어느 것도 JS 비활성화 된 사용자에게는 작동하지 않습니다.

이 문제는 그렇게 드문 일이 아니며 더 나은 방법이 있어야합니다. 이것을 해결하기위한 모범 사례 접근법이 있습니까? 그렇지 않다면 이러한 솔루션 중 하나를 개선 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

웹은 로그 아웃 이벤트를 정확하게 추적 할 수 있도록 제작되지 않았습니다. 사용자가 종료 할 때 브라우저에서 통지를받을 수 없으므로 정상적인 상황에서는 세션 타임 아웃 이벤트를 가두는 것이 가장 좋으며,이 이벤트는 사용자가 페이지를 버린 후 20 분까지 발사되지 않을 수 있습니다. .

이제 "하트 비트"를 제공하기 위해 각 페이지의 타이머 (분당 한두 번)에 AJAX 요청을 넣음 으로써이 점을 조금 향상시킬 수 있지만, 약간의 경고도 있습니다. 세션이 의지가 있는지 확인해야합니다. 여전히 타임 아웃이지만 여전히 JavaScript를 비활성화하여 사용자가 이러한 요청을 차단하지 않을 것이라는 보장은 아닙니다.

다른 팁

JavaScript에서 타이머를 사용하여 서버 Ping을 사용하여 성공했습니다. 제 경우에는 사이트가 JavaScript가 필요하므로 문제가되지 않습니다. 또한이 메커니즘을 사용하여 단일 계정이 두 개의 다른 기계에서 로그인되는 것을 방지하는 점검을 수행 하므로이 해킹을 해야하는 더 많은 이유가 있습니다.

언로드로 명심해야 할 한 가지는 여전히 언로드 이벤트가 해고 될 것이라는 보증이 아니라는 것입니다. 예를 들어 랩톱을 닫는 랩탑에 사람들이 있으면 타이머 접근 방식이 조금 더 정확합니다.

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