본문으로 건너뛰기

2.4. 활용 API

애플리케이션에서 세션과 로그인 상태를 직접 다뤄야 할 때 쓰는 API 입니다. 필수가 아니라 필요할 때 쓰는 것들입니다 — 관리자 화면에서 접속자 목록을 보여 주거나, 특정 사용자를 강제로 로그아웃시키는 기능을 만들 때 씁니다.

모든 API 는 SessionLoginManager.getInstance() 로 얻은 객체에서 호출합니다.

하고 싶은 일메소드
이 요청이 중복 로그인인지 확인isDuplicated(request)
로그인한 사용자 ID 얻기loggedInUserId(request)
지금 로그인해 있는 사용자 목록getLoginUsers()
특정 사용자의 세션 속성 보기getSessionAttributes(sessionId)
특정 사용자를 강제 로그아웃logout(loginId, sessionId)
저장소의 값을 직접 읽기getAttributeDirect(sessionId, name)

중복 로그인 체크

같은 계정으로 다른 곳에서 로그인이 일어났는지 확인합니다. invalidateDuplicateLoginfalse 로 두고 로그아웃 처리를 직접 할 때, 이 값을 보고 판단합니다.

boolean isDuplicated = SessionLoginManager.getInstance().isDuplicated(request);

로그인한 사용자 정보

현재 요청의 세션에 로그인되어 있는 사용자 ID 를 돌려줍니다. 로그인 시점에 login(request, [USER_ID]) 로 넘긴 값입니다. 로그인하지 않았으면 값이 없습니다.

String loginUserId = SessionLoginManager.getInstance().loggedInUserId(request);

로그인 사용자 리스트

지금 로그인해 있는 사용자 목록을 돌려줍니다. 관리자 화면에서 접속자 현황을 보여 줄 때 씁니다.

List<LoginUser> loginUsers = SessionLoginManager.getInstance().getLoginUsers();

LoginUser 하나가 담는 값은 다음과 같습니다.

내용
getLoginId()로그인 시점에 넘긴 사용자 ID
getSessionId()그 사용자의 세션 ID. 강제 로그아웃이나 속성 조회에 씁니다
getType()로그인 시점에 유형을 함께 넘겼다면 그 값
getSessionTimeout()그 세션의 타임아웃(분)
getStatus()세션 상태

특정 사용자나 유형만 골라 보려면 아래를 씁니다.

List<LoginUser> byId = SessionLoginManager.getInstance().getLoginUsersById("hong");
List<LoginUser> byType = SessionLoginManager.getInstance().getLoginUsersByType("admin");

로그인 사용자 Session Attributes

세션 ID 를 주면 그 세션에 담긴 값을 모두 돌려줍니다. 세션 ID 는 위 getLoginUsers()getSessionId() 에서 얻습니다.

Map<String, Object> sessionAttributes = SessionLoginManager.getInstance().getSessionAttributes(sessionId);

특정 로그인 사용자 강제 로그아웃

관리자가 특정 사용자를 로그아웃시킬 때 씁니다. 성공하면 true 를 돌려줍니다.

이 호출은 세션 데이터를 지우지 않고 "중복 로그인이 발생했다" 고 표시만 합니다. 그 사용자가 다음에 요청을 보내면 그때 로그아웃 처리가 이루어집니다. 로그인 유형까지 지정하려면 인자가 셋인 형태를 씁니다.

SessionLoginManager.getInstance().logout(loginId, sessionId);
SessionLoginManager.getInstance().logout(loginId, sessionId, type);

세션 서버에 저장된 데이터 조회

다른 사용자의 세션 값을 저장소에서 바로 읽어야 할 때 씁니다. 현재 요청의 세션은 request.getSession().getAttribute() 로 읽으면 되므로 이 API 가 필요 없습니다.

// 세션 ID 에 해당 속성이 있으면 true
public boolean isAttributeExistDirect(String sessionId, String name)

// 세션 ID 의 속성 값을 Object 로 반환
public Object getAttributeDirect(String sessionId, String name)
SessionLoginManager.getInstance().getAttributeDirect(session.getId(), "userId");
SessionLoginManager.getInstance().isAttributeExistDirect(session.getId(), "userId");

방금 저장한 값을 곧바로 읽으면 아직 저장소에 반영되지 않아 값이 없을 수 있습니다. 그럴 때는 재시도 시간(밀리초)을 넘기는 형태를 씁니다. 그 시간 동안 다시 읽어 봅니다.

SessionLoginManager.getInstance().getAttributeDirect(sessionId, "userId", 500);