[JAVA] Session Timer (서버 연동 실시간 갱신 세션 타이머)
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을 구현하여 클라이언트와 서버 간의 상태 정보를 저장하고 관리함.