1. Map 을 이용한 현재 접속자 목록
CurrentUsersManager
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class CurrentUsersManager {
private static final Map<String, Long> currentUsers = new HashMap<>();
private final long MAX_SESSION_TIME = 12 * 60 * 60 * 1000; // 12시간 (밀리초 단위)
public static void addActiveUser(String userId, long loginTime) {
currentUsers.put(userId, loginTime);
}
public static void removeActiveUser(String userId) {
currentUsers.remove(userId);
}
// 현재접속자 목록 출력
public static List<String> getCurrentUsers() {
return new ArrayList<>(currentUsers.keySet());
}
// 주기적으로 세션 체크하여 일정 시간 이상 지난 사용자 삭제
@Scheduled(fixedDelay = 60 * 60 * 1000) // 1시간마다 체크
public void checkSessionTimeout() {
long currentTime = System.currentTimeMillis();
// 접속한지 12시간이 지나면
currentUsers.entrySet().removeIf(entry -> currentTime - entry.getValue() > MAX_SESSION_TIME);
}
}
static final Map 변수를 선언하여 여기에 로그인/로그아웃 시 id 를 추가/삭제하는 작업을 진행
로그아웃을 누리지 않고 윈도우 창을 나가는 유저가 있기에 세션만료시간을 설정하여 Spring Scheduler 를 사용하여 삭제를 추가로 진행
LoginController
public class AuthController {
@PostMapping("/login")
public void login() {
// ----- login logic -----
// 현재접속자 목록에 추가
long currentTime = System.currentTimeMillis();
CurrentUsersManager.addActiveUser(username, currentTime);
}
@PostMapping("/logout")
public void login() {
// ----- logout logic -----
// 현재 접속자 목록에서 제거
CurrentUsersManager.removeActiveUser(loginVO.getId());
}
}
- Just Do It -
반응형
'Spring' 카테고리의 다른 글
[Spring] jxls 을 이용해 table을 엑셀 파일로 생성해 다운로드 (0) | 2023.03.14 |
---|---|
[Spring] 프론트(JSP) ↔ 백(Controller) 데이터 전달 (0) | 2023.02.27 |
[Spring] 페이징 / 검색 (0) | 2022.12.27 |
[Spring] spring, vue.js 를 이용해 todoList 만들기 (0) | 2022.09.15 |