클라이언트의 요구사항
현재 프로젝트에 접속한 사람이 50명 이하가 되도록 하는 것
설계 야망
50번 초과 사람이 (51번째 사람) 로그인을 하면 , alert 창으로
추가 구매가 필요합니다
라는 문구 띄우도록 할 것 😎
세션
이다. 세션
수가 결국 현재 접속하고 있는 유저 수라고 생각하면 된다. SecurityConfig.java
에 아래 내용을 추가했다. .sessionManagement()
.maximumSessions(1) //세션 수 제한
.maxSessionsPreventsLogin(true);
// 세션 수 제한 디폴트는 기존 유저 로그아웃
// 위 옵션 설정 시 새로운 유저 로그인 제한 시키는 것으로 세션 갯수 유지
레디스란 ? NoSQL로서 Key-Value 타입의 저장소인 레디스(Redis, Remote Dictionary Server)
SessionManager.java
package eci.server.config.security;
import org.springframework.stereotype.Component;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class SessionManager {
private static final String SESSION_COOKIE_NAME = "simultaneous-connection-chk-session";
private Map<String, Object> sessionStore = new ConcurrentHashMap<>();
/**
* 세션 생성
*/
public void createSession(Object value, HttpServletResponse response){
// 세션 id를 생성하고, 값을 세션에 저장
String sessionId = UUID.randomUUID().toString();
sessionStore.put(sessionId, value);
// 쿠키 생성
Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId);
response.addCookie(mySessionCookie);
for(String map : sessionStore.keySet()){
System.out.println("key " + map);
System.out.println("value " + sessionStore.get(map));
}
}
/**
* 세션 조회
*/
public Object getSession(HttpServletRequest request){
Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
if (sessionCookie == null){
return null;
}
return sessionStore.get(sessionCookie.getValue());
}
/**
* 세션 만료
*/
public void expire(HttpServletRequest request){
Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
if (sessionCookie != null){
sessionStore.remove(sessionCookie.getValue());
}
}
private Cookie findCookie(HttpServletRequest request, String cookieName) {
return Arrays.stream(request.getCookies())
.filter(cookie -> cookie.getName().equals(cookieName))
.findAny()
.orElse(null);
}
}