Published 2023. 7. 30. 11:52

 

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 -

 

반응형
복사했습니다!