org.sam.server.http.SessionManager Maven / Gradle / Ivy
package org.sam.server.http;
import org.sam.server.http.web.Request;
import java.time.ZoneId;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* 세션을 관리하는 클래스입니다. 세션의 생명주기를 관리합니다.
*
* @see org.sam.server.http.Session
* */
public class SessionManager {
private static final Set sessionList = new HashSet<>();
private SessionManager() {}
/**
* 세션을 추가합니다.
*
* @param session 추가할 세션
* */
public static void addSession(Session session) {
sessionList.add(session);
}
/**
* 세션을 반환합니다.
*
* @param id 가져올 세션의 아이디
* @return 세션
* */
public static Session getSession(String id) {
return sessionList.stream()
.filter(session -> session.getId().equals(id))
.findFirst().orElse(null);
}
/**
* 세션을 삭제합니다.
*
* @param id 삭제할 세션의 아이디
* */
public static void removeSession(String id) {
sessionList.removeIf(session -> session.getId().equals(id));
}
/**
* 세션의 만료 시간을 확인 후 만료된 세션을 삭제합니다.
* */
public static void removeExpiredSession() {
Iterator iterator = sessionList.iterator();
while (iterator.hasNext()) {
Session session = iterator.next();
if (!isExpiredSession(session)) continue;
iterator.remove();
}
}
/**
* 만료된 세션인지 확인 합니다.
*
* @param session 세션
* @return 만료 여부
* */
private static boolean isExpiredSession(Session session) {
long accessTime = session.getAccessTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
long now = System.currentTimeMillis();
int timeout = session.getTimeout() * 1000 * 1800;
return now - accessTime > timeout;
}
/**
* 핸들러 실행시 필요한 세션을 가져옵니다.
*
* @param request 요청 인스턴스
* @return 세션
* */
public static Session getSessionFromRequest(Request request) {
Set cookies = request.getCookies();
Iterator iterator = cookies.iterator();
while (iterator.hasNext()) {
Cookie cookie = iterator.next();
if (!cookie.getName().equals("sessionId")) continue;
Session session = request.getSession();
if (session != null) {
session.renewAccessTime();
return session;
}
iterator.remove();
}
return new Session();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy