2016-09-15 3 views
0

안녕하세요, 내 /logout 서블릿 세션 제한 시간을 계산하려고합니다. 내가 timeout동적으로 세션 시간 초과를 계산하는 방법은 무엇입니까?

내 doPost 메소드 시간 종료 전에 일정 시간을 정의하는 것은 여기에 있습니다 :

import java.io.IOException; 
    import java.util.logging.Level; 
    import java.util.logging.Logger; 

    import javax.servlet.ServletException; 
    import javax.servlet.annotation.WebServlet; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
    import javax.ws.rs.core.MediaType; 
    import com.sun.jersey.api.client.ClientResponse.Status; 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    long timePassed = 0; 
    long timeout = 60; 

    timePassed = (System.currentTimeMillis() - request.getSession().getLastAccessedTime())/1000; 
    System.out.println(timePassed); 

    response.setStatus(Status.OK.getStatusCode()); 
    response.getWriter().write("[{\"timePassed\": \""+ timePassed + "\", \"limit\": \""+ timeout + "\"}]"); 
    response.setContentType(MediaType.APPLICATION_JSON); 

    if(timePassed >= timeout){ 
     doGet(request, response); 
    } 

} 

나는이 방법 아약스 호출로 모든 초를 기록했다. 아약스 호출이 제대로 작동합니다. 프런트 엔드에서 데이터를 가져 오기 때문에 GUI가 제대로 작동합니다. 하지만 timePassed은 0에 머물러 있습니다. 사용자가 유휴 상태로 머문 시간은 어떻게 계산합니까?

+0

Ajax로 서버에 접속하면 세션 액세스로 간주됩니다. 그래서 그렇게하면 세션이 만료되는 것을 방지 할 수 있습니다. – developerwjk

+0

@developerwjk 예 나는 내가 다른 방식으로 그것을하는 방법에 아직도 붙어있는 것을 깨달았다. – th3r1singking

+0

유휴 상태 일 때 무엇을 의미합니까? 세션 생성 시간이 있지만 "유휴"가 아닌 세션이 생성 된 이후의 시간이 다를 수 있습니다. – stdunbar

답변

1

왜 자바 스크립트를 사용하여 클릭이나 마우스 움직임을 감지하지 않습니까?

jQuery를 또는 기본 자바 스크립트 ... 당신이 필요로 수행 할 수

[편집] certains 백엔드 릴리스로 유휴 시간을 호출하는 경우

, 당신은 자바 스크립트를 가진 사람들을 모니터링 할 수 있습니다 :-)

+0

예 알아 냈습니다. 하지만 내가하려는 일은 백엔드에 머문 시간이다. 그래서 여러 개의 탭에서 세션을 유지하고 동기화 할 수 있습니다. – th3r1singking

+1

저장소 (데이터베이스, 파일, Java의 세션 개체 [있는 경우])에 저장하고 사용자가 서버에 다시 도달하면 마지막으로 저장된 날짜 시간을 검색합니다. 인증을 사용합니까? 데이터베이스의 {Key : UserX, Value : 20160916 16:27} 저장 장치의 예. 사용자가 조회 한 다음 해당 사용자를 검색하면 마지막 활성 시간입니다 ... 클라이언트와 서버간에 데이터를 동기화해야하는 경우 서버가 웹 소켓, 폴링을 사용하여 클라이언트와 통신 할 수있는 SignalR 또는 기타 lib를 사용하십시오. –

1

timePassed가 0으로 유지되는 이유는 서블릿을 직접 호출하기 때문입니다.

아래의 코드에서 디버그 포인트를 추가하고 디버그 모드로 서버를 다시 시작하십시오. 디버거가 디버그 포인트에 도달하면 5-6 초 동안 대기하고 F8 키를 눌러 디버깅을 일시 중단합니다. 당신은 확실히 DEBUG 대신, 0

timePassed = (System.currentTimeMillis() - request.getSession().getLastAccessedTime())/1000; 
System.out.println(timePassed); 

하나 더 트릭 이외의 timePassed에 대한 몇 가지 값을 얻을 것이다. timePassed 값을 0으로 설정 한 후 몇 초 동안 기다렸다가 페이지를 새로 고칩니다 (양식을 다시 제출하십시오). 당신은 아래와 같은 출력을 얻을 것이다 :

Session TimeOut

먼저 서블릿로 리디렉션 할 때 세션이 막 시작되기 때문에, 경과 세션 시간이 0 때문입니다. 동일한 세션에서 새로운 요청이 이루어지면 경과 시간이 증가합니다.

희망이 도움이됩니다.

관련 문제