Developer's Development

[JAVA] Session Timer (서버 연동 실시간 갱신 세션 타이머) 본문

개발/JAVA

[JAVA] Session Timer (서버 연동 실시간 갱신 세션 타이머)

mylee99 2024. 1. 5. 17:50

Case)

- 다른 화면이나 브라우저 간에도 계속해서 남은 시간이 갱신되는 30분 세션 타이머 생성
- 서버 측에서 세션 타이머를 관리하고, 

클라이언트 측에서 서버에 주기적으로 요청하여 세션의 비활동 경과 시간을 업데이트
- 설정 파일(application.yml)에서도 세션의 기본 만료 시간을 설정

 

  • 세션의 시간과 관련된 주요 메서드

- getLastAccessedTime()
// 세션이 마지막으로 접근된 시간을 반환함. 세션의 활동 여부를 확인하거나 세션의 유효성을 판단하는 데 사용함.
- getMaxInactiveInterval()
// 세션의 최대 비활동 시간을 초 단위로 반환함. 세션의 만료 시간을 확인하는 데 사용할 수 있음.
- getCreationTime()
// 세션이 생성된 시간을 반환함. 세션의 생성 시간을 파악하는 데 사용할 수 있음. 단위는 1/1000초임.
- invalidate()
// 세션을 무효화함. 만료 시간을 조작하지 않고 세션을 종료할 때 사용됨.

 

JAVA (로그인 메소드에 아래 코드 추가)
//로그인 성공 시, 세션 타이머를 세션 속성에 설정
session.setAttribute( "sessionTime", session.getMaxInactiveInterval() );

 

HTML
<span id="sessionTimer"></span>
<button type="button" onclick="sessionExtension();">연장</button>

 

jQuery
fetchAndUpdateRemainingTime = function () {
    $.get("/getSessionRemain", function (response) {
        var countdown = parseInt(response, 10);
        if (countdown < 1) {
            goLogOut();
        } else {
            updateTimerDisplay(countdown);
        }
    });
}

updateTimerDisplay = function (countdown) {
    var minutes = Math.floor(countdown / 60);
    var seconds = countdown % 60;
    var formattedTime = ('0' + minutes).slice(-2) + ':' + ('0' + seconds).slice(-2);
    $("#sessionTimer").text(formattedTime);
}

fetchAndUpdateRemainingTime();
setInterval(fetchAndUpdateRemainingTime, 1000);

sessionExtension = function () {
    $.ajax({
        type:"POST", dataType:'json', data:{}, url:"/sessionExtension",
        //success, error function
    });
}

 

JAVA

세션 연장 시 연장한 시긱을 세션에 저장하고, 연장한 시각 또는 세션의 생성 시각으로 세션의 남은 시간을 계산함.
- Math.max(0, ...)
// 계산된 남은 시간이 음수가 될 경우를 방지하기 위해 사용됨.

// 만약 남은 시간이 음수라면 0으로 설정하여 음수가 되지 않도록 함.

/*
* 세션 연장
*/
@RequestMapping("/sessionExtension")
public void sessionExtension {
    //..기타 세션 연장 관련 코드 생략
    session.setAttribute( "extensionTime", System.currentTimeMillis() );
}

/*
* 세션 남은 시간 반환
*/
@ResponseBody
@RequestMapping("/getSessionRemain")
public Integer getSessionRemain( HttpServletRequest request ) {
    HttpSession session = request.getSession();
    Long remianTime = session.getAttribute( "extensionTime" ) == null ? session.getCreationTime() : (Long) session.getAttribute( "extensionTime" );
    return (int) Math.max(0, session.getMaxInactiveInterval() - (System.currentTimeMillis() - remianTime) / 1000);
}

/**
 * 로그아웃
 */
@RequestMapping("/logout")
public String logout( HttpServletRequest request ) {
    request.getSession().invalidate();
    return "/login";
}

 

  • Session Models: Request vs. HttpSession

- request.getSession()
// 서블릿에서 사용되며, 현재 요청과 연결된 세션 객체를 제공함.
// 이를 통해 클라이언트와 서버 간에 유지되어야 하는 사용자의 상태 정보를 저장하고 검색할 수 있음.

- HttpSession
// 이 세션 객체의 인터페이스를 나타내며, 이를 통해 세션 데이터를 설정하거나 검색할 수 있음.
// 세션은 일반적으로 쿠키 또는 URL 재작성과 같은 메커니즘을 통해 클라이언트와 연결되며, 사용자의 상태 정보를 유지하고 관리하는 데 사용됨.

- 요약
// request.getSession()을 통해 현재 요청에 대한 세션 객체를 가져오고,
// 이 세션 객체는 HttpSession을 구현하여 클라이언트와 서버 간의 상태 정보를 저장하고 관리함.

Comments