728x90
반응형
Listener : 특정 이벤트가 발생하기를 기다리다 이벤트 발생 시 실행되는 컴포넌트.
WebListener
@Weblistener는 ServletListener를 정의하는데 사용된다.
ServletListener란? 웹 애플리케이션의 특정 이벤트(시작 세션 생성/소멸 등)를 감지하고 이에 반응하는 컴포넌트이다.
- 클래스를 Listener로 등록하게 되면 서버가 종료될 때 까지 백그라운드 상태에서 동작하는 데몬(deamon)이 되기 때문에 간단한 값을 공유할 수 있다.
- 추가로 ServletContextListener인터페이스를 상속받으면 서버가 실행/종료 될 때 특정 동작을 수행할 수 있다.
사용 예시:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyAppListener implements ServletContextListener {
// 애플리케이션이 시작될 때 실행
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("애플리케이션 시작됨");
// 초기화 작업 수행 가능
}
// 애플리케이션이 종료될 때 실행
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("애플리케이션 종료됨");
// 리소스 정리 등 수행 가능
}
}
HttpSessionListener
HttpSessionListener란? Servlet API에서 제공하는 인터페이스로, HTTP 세션의 생성과 소멸을 감지하여 특정 작업을 수행할 수 있게 해주는 Servlet Listener이다. 즉, 세션 관련 이벤트를 처리할 수 있게 해준다.
HttpSessionListener인터페이스를 상속받으면 sessionCreated()와 sessionDestroyed() 메서드를 Override할 수 있다.
- sessionCreated() : 세션이 생성될 때 실행됨.
- sessionDestroyed() : 세션이 소멸될 때 실행됨. (시간이 만료되어 자연 소멸되는 경우 이벤트가 발생하지 않음)
사용 예시:
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class MySessionListener implements HttpSessionListener {
// 세션이 생성될 때 호출
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("새로운 세션 생성됨: " + se.getSession().getId());
// 예: 세션 카운터 증가
}
// 세션이 소멸될 때 호출
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("세션이 소멸됨: " + se.getSession().getId());
// 예: 세션 데이터 정리
}
}
HttpSessionListener로 중복 로그인 방지 로직 구현
@WebListener
public class SessionConfig implements HttpSessionListener{
private static final Map<String, HttpSession> sessions = new ConcurrentHashMap<>();
//중복로그인 지우기
public synchronized static boolean getSessionidCheck(String userId, HttpSession hs, boolean loginCheck){
// 중복 체크
if(session.get(userId) != null) {
if(loginCheck) {
// loginCheck가 true면 confirm을 받고온 것이기 때문에 세션 제거
removeSessionForDoubleLogin(result);
}else {
return false;
}
}
sessions.put(userId, hs);
return true;
}
private static void removeSessionForDoubleLogin(String userId){
if(userId != null && userId.length() > 0){
sessions.get(userId).invalidate();
sessions.remove(userId);
}
}
@Override
public void sessionCreated(HttpSessionEvent hse) { // 세션이 생성될 때 동작
//System.out.println(hse);
//sessions.put(hse.getSession().getId(), hse.getSession());
}
@Override
public void sessionDestroyed(HttpSessionEvent hse) { // 세션이 소멸될 때 동작
//if(sessions.get(hse.getSession().getId()) != null){
// sessions.get(hse.getSession().getId()).invalidate();
// sessions.remove(hse.getSession().getId());
}
}
}
sessionCreated, Destroyed는 자연소멸 (시간만료)의 경우에는 동작하지 않기 때문에 사용 권장하지 않는다.
728x90
반응형
'🍃SpringFramework > SpringMVC' 카테고리의 다른 글
[SpringMVC] @Value로 Static 변수에 값 주입할 수 있을까? (0) | 2024.12.10 |
---|---|
[SpringMVC] 주요 @Annotation들 (2) | 2023.08.19 |
[SpringMVC] REST API & Ajax (0) | 2023.08.19 |
[SpringMVC] MyBatis (0) | 2023.08.19 |
[SpringMVC] TDD (0) | 2023.08.19 |