세션 어트리뷰트 리스너 ( SessionAttributeListener ) 사용 예제

2014. 7. 29. 15:10공부/SPRING

세션 어트리뷰트 리스너


세션 어트리뷰트 리스너는 세션이 변화할 때 그 알림을 받습니다


일반적인 디버깅에 유용하고, 또한 분산 웹 어플리케이션을 작성할 때, 클러스터의 다른 장비로 세션 복제가 기대된대로 잘 작동하는지 확인하는 데 유용합니다.


세션이 생성되거나 사라질 때의 이벤트를 체크하고 싶다면 세션 리스너를 보면 됩니다. 이 두 인터페이스들은 생성, 삭제, 변화 이벤트를 잡는 하나의 리스너를 만들기 위해, 하나의 클래스에 구현될 수 있습니다.


이 페이지는 오직 세션 어트리뷰트 리스너 인터페이스만을 다룹니다.



세션 어트리뷰트 리스너를 생성하기


세션 어트리뷰트 리스너를 생성하기 위해서는 HttpSessionAttributeListener 인터페이스를 구현하는 클래스를 생성합니다.


이는 아래의 세 가지 메쏘드를 구현하는 것을 수반합니다.


public void attributeAdded(HttpSessionBindingEvent sessionBindingEvent);
public void attributeRemoved(HttpSessionBindingEvent sessionBindingEvent);
public void attributeReplaced(HttpSessionBindingEvent sessionBindingEvent);


각각의 리스너 클래스는 매개변수가 없는 퍼블릭 생성자를 가져야 합니다.


attributeAdded()


이 메쏘드는 HttpSession.setAttribute() 를 통해 새로운 세션 속성이 더해질때마다 호출됩니다.

속성이 대체된다면, attributeReplaced() 메쏘드가 호출됩니다.


attributeRemoved()


이 메쏘드는 HttpSession.removeAttribute() 를 통해 세션 속성이 제거될 때마다 호출됩니다.


attributeReplaced()


이 메쏘드는 이미 존재하고 있는 세션 속성이 HttpSession.setAttribute()를 통해 새로운 값으로 대체될 때 호출됩니다.


HttpSession


이 세션은 HttpSessionBindingEvent 객체를 통해 위 메쏘드들로 전달됩니다.

아래와 같이 사용할 수 있습니다.


HttpSession session     = sessionBindingEvent.getSession();



변경된 속성 사용하기


변경된 속성의 이름과 값은 HttpSessionBindingEvent 객체를 통해 전달됩니다.

아래처럼 getName()과 getValue() 메쏘드를 통해 사용할 수 있습니다.


String attributeName = sessionBindingEvent.getName();

        String attributeValue = sessionBindingEvent.getValue();



전체 예제


import javax.servlet.*;

public final class MySessionAttributeListener
implements HttpSessionAttributeListener {

  public MySessionAttributeListener() {
  }

  public void attributeAdded(HttpSessionBindingEvent sessionBindingEvent) {

    // 세션을 얻습니다.
    HttpSession session = sessionEvent.getSession();

    // 몇몇 정보의 로그를 남깁니다.
    System.out.println("[SessionAttr] "+new java.util.Date()+" Attribute added, session "+session+": "+sessionBindingEvent.getName()+"="+sessionBindingEvent.getValue());
  }
  
  public void attributeRemoved(HttpSessionBindingEvent sessionBindingEvent) {

    // 세션을 얻습니다.
    HttpSession session = sessionEvent.getSession();

    // 로그를 남깁니다.
    System.out.println("[SessionAttr] "+new java.util.Date()+" Attribute removed, session "+session+": "+sessionBindingEvent.getName());
  }
  
  public void attributeReplaced(HttpSessionBindingEvent sessionBindingEvent) {

    // 세션을 얻습니다.
    HttpSession session = sessionEvent.getSession();

    // 로그를 남깁니다.
    System.out.println("[SessionAttr] "+new java.util.Date()+" Attribute replaced, session "+session+": "+sessionBindingEvent.getName()+"="+sessionBindingEvent.getValue());
  }
}



세션 어트리뷰트 리스너를 web.xml에 추가하기


위에서 생성한 클래스를 WEB-INF/classes 에 넣고, 세션 어트리뷰트 리스너를 사용하기 위해 아래 내용을 web.xml에 추가합니다.

<listener> <listener-class>MySessionAttributeListener</listener-class> </listener>



출력 예제


위 코드를 사용한 실제 어플리케이션의 일부 출력입니다. 어플리케이션이 톰캣 클러스터링을 이용해 클러스터되어있기 때문에 세션이 DeltaSessionFacade 로 보입니다. 아래 코드는 세션 복제 문제를 검출하거나, 클러스터의 다른 장비로 세션 속성이 제대로 복제되었는지 검증하기 위해 사용됩니다.

[SessionAttr] Wed Dec 06 23:33:39 EST 2006 Attribute added, session org.apache.catalina.cluster.session.DeltaSessionFacade@3d8f1be9: name=Cassie [SessionAttr] Wed Dec 06 23:33:39 EST 2006 Attribute replaced, session org.apache.catalina.cluster.session.DeltaSessionFacade@3d8f1be9: marketSettings=portal.market.Settings@3302fc5 [SessionAttr] Wed Dec 06 23:33:39 EST 2006 Attribute replaced, session org.apache.catalina.cluster.session

.DeltaSessionFacade@3d8f1be9: javax.servlet.jsp.jstl.fmt.request.charset=ISO-8859-1


아래는 세션이 만료되었을 때, 톰캣이 세션에서 변수들을 깨끗이 제거하는 것을 보여줍니다.

[SessionAttr] Thu Dec 07 00:22:45 EST 2006 Attribute removed, session org.apache.catalina.cluster.session.DeltaSessionFacade@3d8f1be9: name [SessionAttr] Thu Dec 07 00:22:45 EST 2006 Attribute removed, session org.apache.catalina.cluster.session.DeltaSessionFacade@3d8f1be9: marketSettings [SessionAttr] Thu Dec 07 00:22:45 EST 2006 Attribute removed, session org.apache.catalina.cluster.session.DeltaSessionFacade@3d8f1be9: javax.servlet.jsp.jstl.fmt.request.charset



원본 출처 : http://wiki.metawerx.net/wiki/SessionAttributeListener