2.4. 활용 API
애플리케이션에서 세션과 로그인 상태를 직접 다뤄야 할 때 쓰는 API 입니다. 필수가 아니라 필요할 때 쓰는 것들입니다 — 관리자 화면에서 접속자 목록을 보여 주거나, 특정 사용자를 강제로 로그아웃시키는 기능을 만들 때 씁니다.
모든 API 는 SessionLoginManager.getInstance() 로 얻은 객체에서 호출합니다.
| 하고 싶은 일 | 메소드 |
|---|---|
| 이 요청이 중복 로그인인지 확인 | isDuplicated(request) |
| 로그인한 사용자 ID 얻기 | loggedInUserId(request) |
| 지금 로그인해 있는 사용자 목록 | getLoginUsers() |
| 특정 사용자의 세션 속성 보기 | getSessionAttributes(sessionId) |
| 특정 사용자를 강제 로그아웃 | logout(loginId, sessionId) |
| 저장소의 값을 직접 읽기 | getAttributeDirect(sessionId, name) |
중복 로그인 체크
같은 계정으로 다른 곳에서 로그인이 일어났는지 확인합니다. invalidateDuplicateLogin 을 false 로 두고 로그아웃 처리를 직접 할 때, 이 값을 보고 판단합니다.
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);