HttpSessionListener를 이용해 중복로그인을 방지할 수 있는데, 이번 프로젝트에는 HttpSessionListener를 통해 session 만료 시간이 되면 WebSocket을 통해 message를 전달하여 자동 로그아웃시키는 기능을 구현하였다.
HttpSessionListener의 객체는 Session이 생성되거나 제거될 때 발생하는 이벤트를 제공해주어 등록만해주면 세션을 통제할 수 있다.
@WebListener
//@RequiredArgsConstructor
public class SessionConfig implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent hse) {
//세션 생성시
}
@Override
public void sessionDestroyed(HttpSessionEvent hse) {
//세션 삭제시
}
}
HttpSessionListener는 EventListener를 상속받아 구현되어 있고 sessionCreated와 sessionDestroyed를 상속받는다.
메소드명 그대로 sessionCreated는 세션이 생성될 때 동작하며, sessionDestroyed는 세션이 삭제될 때 생성된다.
- sessionCreated : 이 메서드가 호출되는 시점은 session 이 생성되는 시점으로, 동일 sessionId 에서는 1회만 호출된다.
- sessionDestroved : 마찬가지로 세션이 invaild 되는 시점에 호출되며, setMaxInactiveInterval 에 지정해 놓은 세션 타임아웃이다. 하여도 동일하게 호출된다.
int timeout = 3600;
private final AtomicInteger counter = new AtomicInteger();
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
httpSessionEvent.getSession().setMaxInactiveInterval(timeout); //sec
counter.incrementAndGet();
updateSessionCounter(httpSessionEvent);
}
private void updateSessionCounter(HttpSessionEvent httpSessionEvent) {
httpSessionEvent.getSession().getServletContext().setAttribute("activeSession", counter.get());
}
private final String sessionTopic = "/topic/session";
private final SimpMessagingTemplate simpMessagingTemplate;
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
SessionUser sessionUser = (SessionUser) httpSessionEvent.getSession().getAttribute(SessionUser.SESSION_KEY);
counter.decrementAndGet();
updateSessionCounter(httpSessionEvent);
if ((System.currentTimeMillis() - httpSessionEvent.getSession().getLastAccessedTime()) / 1000 >= timeout) {
simpMessagingTemplate.convertAndSend(sessionTopic, new WebSocketMessage("server", "success", "세션이 만료되었습니다.", null));
}
}
나아가 AtomicInteger를 사용하여 모든 활성 세션을 추적하는데,
SessionListener 안에서 사용한 AtomicInteger는 원자성을 보장하는 integer이다.
AtomicInteger클래스가 값을 읽고 쓰는 동안 변경되지 않는다는 걸 보장하여 동기화 문제를 해결해준다.
참고
https://www.javadevjournal.com/spring-boot/spring-boot-session-listener/
Spring Boot Session Listener
A quick guide to the Spring Boot HttpSessionListner. Learn when an how to customize httpsession listern in your Spring Boot application.
www.javadevjournal.com
https://cornswrold.tistory.com/278
Atomic 클래스는 무엇을 제공하는가?
자바 동시성 프레임워크에는 모든 기본 타입을 덮어씌우는 AtomicInteger, AtomicBoolean 같은 Atomic 클래스들과 참조 타입에 대한 AtomicReference클래스가 추가되었다. 이 클래스들은 모두 원자(atomic)연산
cornswrold.tistory.com
https://myhappyman.tistory.com/116
Spring - HttpSessionListener 로그인 세션 관리(중복 로그인 방지하기)
웹을 하다보면 자주 접하는 중복 로그인 방지 기능 요청사항이 들어오는데, HttpSessionListener를 통해 관리할 수 있습니다. 해당 객체는 Session이 생성되거나 제거될때 발생하는 이벤트를 제공하므
myhappyman.tistory.com
https://hhseong.tistory.com/179
[Spring] HttpSessionListener 이용해 동시 로그인 사용자 및 세션 관리
안녕하세요 깐지꾼지빠 입니다! 얼마전에 울 둥이들 드디어 !! 오지 않을 것만 같았던 돌이 지났습니다 !! 짝짝짝(광고클릭..) 얼마전이라고 해도 사실 한달이 지났시점이라.. 7월 중순에 잔치 했
hhseong.tistory.com
'Web > Else' 카테고리의 다른 글
Intellij 사용 팁(추가) (0) | 2021.11.25 |
---|---|
[Maven]빌드하여 jar 파일 만들기 (0) | 2021.11.16 |
[Web]Token 기반 인증 (0) | 2021.11.11 |
[Web]Maven LifeCycle (0) | 2021.11.04 |
[Web]multipart/form-data (0) | 2021.10.28 |