본문 바로가기
🍃SpringFrameworks/SpringMVC

[SpringMVC] WebListener & HttpSessionListener

by inbeom 2023. 8. 19.
728x90

WebListener

@WebListener annotation을 사용하면 해당 클래스는 Listener가 된다.

  • Listener : 특정 이벤트가 발생하기를 기다리다 이벤트 발생 시 실행되는 컴포넌트를 뜻한다.
  • 클래스를 Listener로 등록하게 되면 서버가 종료될 때 까지 백그라운드 상태에서 동작하는 데몬(deamon)이 되기 때문에 간단한 값을 공유할 수 있다.
  • 추가로 ServletContextListener인터페이스를 상속받으면 서버가 실행/종료 될 때 특정 동작을 수행할 수 있다.

 

HttpSessionLIstener

HttpSessionListener인터페이스를 상속받으면 sessionCreated()와 sessionDestroyed() 메서드를 Override할 수 있다.

  • sessionCreated() : 세션이 생성될 때 실행됨.
  • sessionDestroyed() : 세션이 소멸될 때 실행됨. (시간이 만료되어 자연 소멸되는 경우 이벤트가 발생하지 않음)

 

중복 로그인 방지

@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

'🍃SpringFrameworks > SpringMVC' 카테고리의 다른 글

[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
[SpringMVC] AOP (Aspect Oriented Programming)  (0) 2023.08.19