"HttpSessionListener"는 "HttpSession" 라이프 사이클 변경에 대해 알림 이벤트를 수신하기 위한 인터페이스입니다. ("Interface for receiving notification events about HttpSession lifecycle changes.")
"HttpSessionListener"는 "sessionCreated"는 세션이 생성될 때, "sessionDestroyed"는 세션이 파기될 때 호출됩니다.
"HttpSessionAttributeListener"는 "HttpSession" 속성 변경에 대해 알림 이벤트를 수신하기 위한 인터페이스입니다. ("Interface for receiving notification events about HttpSession attribute changes.")
"HttpSessionAttributeListener"는 "attributeAdded"는 세션 속성이 추가될 때, "attributeRemoved"는 세션 속성이 삭제될 때, "attributeReplaced"는 세션 속성이 변경될 때 호출됩니다.
"HttpSessionListener", "HttpSessionAttributeListener"을 만들고 이벤트가 호출되는 시점을 출력을 통해 확인해보겠습니다.
1. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.hom.project.test2.listener"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Listener]를 클릭합니다.
"Create Listener"창의 "Class name"에 "TestHttpSessionListener"를 입력합니다.
"Next >"버튼을 클릭합니다.
이벤트를 수신하고 싶은 이벤트를 선택합니다.
"Http session events"의 "Lifecycle", "Changes to attributes"를 체크합니다.
"Next >"버튼을 클릭합니다. 또는 "Finish"버튼을 클릭해서 완료할 수 있습니다.
"Interfaces"에 "HttpSessionListener"와 "HttpSessionAttributeListener"인터페이스를 동시에 받아 구현하는 것을 알 수 있습니다.
"Finish"버튼을 클릭합니다.
"TestHttpSessionListener.java"파일이 생성됩니다.
현재 "Dynamic Web Module 3.1"로 구성되어 있어 "TestHttpSessionListener.java"에 "@WebListener" 어노테이션을 사용하고 있습니다.
@WebListener
"web.xml"에서 구성하고 싶다면 "TestHttpSessionListener.java"에 "@WebListener" 어노테이션을 삭제한 후 "web.xml"에 다음과 같이 추가하면 됩니다.
<listener>
<listener-class>com.home.project.test2.listener.TestHttpSessionListener</listener-class>
</listener>
처리 방식은 동일합니다.
"TestHttpSessionListener.java"의 "constructor"와 "sessionCreated", "attributeAdded", "attributeRemoved", "attributeReplaced", "sessionDestroyed"에 출력문을 코딩하여 어느 시점에서 호출되는 지를 확인해하기 위해서입니다.
public TestHttpSessionListener() {
System.out.println("HttpSessionListener 생성자 실행");
}
public void sessionCreated(HttpSessionEvent se) {
System.out.println("HttpSession 생성 실행 : " + se.toString());
}
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("HttpSession에 속성 추가 - 속성명 : " + event.getName() + ", 속성 값 : " + event.getValue());
}
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("HttpSession에 속성 삭제 - 속성명 : " + event.getName() + ", 속성 값 : " + event.getValue());
}
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("HttpSession에 속성 변경 - 속성명 : " + event.getName() + ", 속성 값 : " + event.getValue());
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("HttpSession 파괴 실행 : " + se.toString());
}
2. "Servers"탭에서 "Tomcat8"를 선택하고 "start"버튼(start the server)을 클릭하고 "Console"탭을 클릭합니다.
[Console]
ServletContextListener 생성자 실행
HttpSessionListener 생성자 실행 - 추가된 리스너 생성자
("TestHttpSessionListener"의 "constructor" 실행)
ServletRequestListener 생성자 실행
ServletContextAttributeListener 생성자 실행
ServletContext 초기화 실행
3. 웹 브라우저에서 "http://localhost:8080/test2/testform.do"를 입력합니다.
"Console"탭을 클릭합니다.
[Console]
HttpSession 생성 실행 : javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@1b0531c5]
(서블릿 필터(TestSecurityFilter)에서 "requestDispatcher.forward"되면서 JSP를 처리하면서 세션이 생성됩니다.)
[Console]
HttpSession에 속성 추가 - 속성명 : auth, 속성 값 : com.home.project.test2.vo.UserVO@403f18ae
(서비스(TestLoginService)의 "process"에서 인증 후 속성 추가)