본문 바로가기
Java/Servlet & JSP

JSP) 데이터 저장 용도로 존재하는 객체, 서블릿 이벤트 리스너

by 박채니 2022. 6. 22.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


데이터를 저장할 용도로 존재하는 객체

- pageContext

- HttpServletRequest

- HttpSession

- ServletContext


서블릿 리스너

- 웹 컨테이너가 관리하는 라이프 사이클 사이에 발생하는 이벤트를 감지하여 해당 이벤트 발생 시 해당 이벤트에 대한 일련의 로직을 처리하는 인터페이스

 

서블릿 이벤트 리스너 종류 (실제로는 더 많음!)

① ServletContextListener

- 웹 애플리케이션의 시작과 종료 시 자동으로 발생하는 이벤트

 

② ServletContextAttributeListener

- 웹 컨테이너에 저장된 속성의 값이 변경될 경우 발생하는 이벤트

 

③ HttpSessionListener

- HTTP 세션이 생성되거나 종료되는 시점에 발생하는 이벤트

 

④ HttpSessionAttributeListener

- HTTP 세션에 대한 속성의 값이 변경될 경우 발생하는 이벤트

 

⑤ HttpSessionActivationListener

- HTTP 세션이 활성화 또는 비활성화가 발생하려 할 때 감지

 

⑥ HttpSessionBindingListener

- 현재 세션에 객체가 추가되거나 해제될 때 발생하는 이벤트


접속한 사용자의 수 카운트

Listener 템플릿을 이용하여 SessionCounterListener를 생성하였습니다.

(Lifecycle - HttpSessionListener 인터페이스 구현)

 

@WebListener

- web.xml에 Listener 등록 처리

@WebListener
public class SessionCounterListener implements HttpSessionListener {
	private static int activeSessions;
    /**
     * Default constructor. 
     */
    public SessionCounterListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
     */
    public void sessionCreated(HttpSessionEvent se)  { 
         activeSessions++;
         System.out.println("[sessionCreated] 현재 세션 수 : " + activeSessions);
    }

	/**
     * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
     */
    public void sessionDestroyed(HttpSessionEvent se)  { 
    	if(activeSessions > 0) {
    		activeSessions--;
    	}
    	System.out.println("[sessionDestroyed] 현재 세션 수 : " + activeSessions);
    }
}

 

브라우저 새로고침 시 콘솔창

 

다른 브라우저에서 접속 시

 

세션 제거 시

(세션 제거는 invalidation처리 혹은 세션이 만료되는 것이므로 로그인 후 로그아웃 처리)

session이 삭제 되고 또 다른 session이 발급되기 때문에 바로 sessionCreated가 이뤄진 것을 확인할 수 있습니다.

 


속성 추가 및 삭제 이벤트 리스너

(changes to attributes - HttpSessionAttributeListener 인터페이스 구현)

@WebListener
public class MemberLoginListener implements HttpSessionAttributeListener {

    /**
     * Default constructor. 
     */
    public MemberLoginListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see HttpSessionAttributeListener#attributeAdded(HttpSessionBindingEvent)
     */
    public void attributeAdded(HttpSessionBindingEvent se)  { 
    	String name = se.getName();
    	Object value = se.getValue();
    	System.out.println("[attributeAdded] " + name + " = " + value);
    	
    	if("loginMember".equals(name)) {
    		Member loginMember = (Member) value;
    		System.out.println("[회원로그인] " + loginMember.getMemberName() + "님 로그인!");
    	}
    }

	/**
     * @see HttpSessionAttributeListener#attributeRemoved(HttpSessionBindingEvent)
     */
    public void attributeRemoved(HttpSessionBindingEvent se)  { 
    	String name = se.getName();
    	Object value = se.getValue();
    	System.out.println("[attributeRemoved] " + name + " = " + value);
    	
    	if("loginMember".equals(name)) {
    		Member logoutMember = (Member) value;
    		System.out.println("[회원로그아웃] " + logoutMember.getMemberName() + "님 로그아웃!");
    	}
    }

	/**
     * @see HttpSessionAttributeListener#attributeReplaced(HttpSessionBindingEvent)
     */
    public void attributeReplaced(HttpSessionBindingEvent se)  { 

    }
}

※ attributedReplaced는 동일한 이름으로 다른 객체를 저장할 때(덮어쓰기) 호출되는 메소드

 

속성 등록 시 (로그인 처리)

 

속성 삭제 시 (로그아웃 처리)

세션이 제거 되면서 존재하던 속성도 제거 되므로 attributeRemoved 메소드가 실행되었습니다.

 

msg

아이디/비밀번호를 잘못 입력하였을 때 발생하는 msg는 한 번만 표시해주기 위하여 alert 실행 후 제거가 되었으므로 attributedAdded 메소드가 실행되고 attributeRemoved 메소드가 연이어서 실행된 것을 확인할 수 있습니다.