이전글
HttpSessionBindingListener 바운드와 언바운드 조건
UserInfo 클래스가 다음과 같이 HttpSessionBindingListener를 구현하였다고 하였을때 valueBound()와 valueUnbound() 메서드가 호출되는 조건에 대하여 알아보도록 하겠습니다.
package listener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class UserInfo implements HttpSessionBindingListener {
String id;
String password;
// 기본 생성자가 꼭 있어햐 함
public UserInfo() {
}
public UserInfo(String id, String password) {
this.id = id;
this.password = password;
}
public String getId() {
return id;
}
@Override
public void valueBound(HttpSessionBindingEvent hsbe) {
System.out.println("UserInfo 객체가 세션에 바인딩됨");
}
@Override
public void valueUnbound(HttpSessionBindingEvent hsbe) {
System.out.println("UserInfo 객체가 세션에서 언바인딩(제거됨)");
}
} |
cs |
valueBound() 호출 조건
먼저 valueBound()는 HttpSession#setAttribute(name, value) 메서드를 통하여 특정한 name에 대해 새로운 리스너 구현체가 바인딩 되는 경우입니다.
만약 LoginServlet에서 로그인시 아래와 같이 같은 name으로 같은 리스너 구현 객체를 두 번 setAttribute()를 호출했다면 어떨까요? 이때는 valueBound()가 한 번 호출됩니다.
UserInfo userInfo = new UserInfo(id, password);
session.setAttribute("userInfo", userInfo);
session.setAttribute("userInfo", userInfo); |
cs |
만약 다른 name으로 같은 리스너를 바인딩 한 경우는 어떨까요? 이때는 valueBound()가 두 번 호출됩니다. 리스너 인스턴스는 하나지만 새로운 name으로 세션에 바인딩 되었기 때문입니다.
UserInfo userInfo = new UserInfo(id, password);
session.setAttribute("userInfo", userInfo);
session.setAttribute("userInfo2", userInfo); |
cs |
마지막으로 같은 name에 대해 새로운 리스너 인스턴스를 바인딩 한 경우입니다.
UserInfo userInfo = new UserInfo(id, password);
UserInfo userInfo2 = new UserInfo(id, password);
session.setAttribute("userInfo", userInfo);
session.setAttribute("userInfo", userInfo2); |
cs |
이 경우 기존에 있던 UserInfo 객체가 새로운 UserInfo로 세션에 바인딩 되므로 valueBound()가 두 번 호출되며, 처음의 UserInfo는 언바인딩 되어 valueUnbound()가 호출되었습니다.
valueUnbound() 호출 조건
먼저valueUnbound()는 HttpSession#removeAttribute(name) 메서드를 통하여 리스너 객체가 세션에서 제거되었거나 HttpSession#invalidate()메서드로 세션 자체가 제거되면서 세션에 바인딩 된 리스너 객체가 제거된 경우 호출됩니다.
추가적으로 앞서 보았던 같은 Attribute name에 대해 새로운 리스너 객체가 바인딩 되는 경우입니다.
UserInfo userInfo = new UserInfo(id, password);
UserInfo userInfo2 = new UserInfo(id, password);
session.setAttribute("userInfo", userInfo);
session.setAttribute("userInfo", userInfo2); //새로운 리스너 객체 바인딩. 기존의 userInfo는 언바인딩 됨 |
cs |
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] ServletRequestAttributeListener 리스너로 ServletRequest attribute 변경시 이벤트 처리하기 (0) | 2019.07.16 |
---|---|
[서블릿/JSP] ServletRequestListener 리스너로 ServletRequest 생성 소멸시 이벤트 처리하기 (0) | 2019.07.15 |
[서블릿/JSP] HttpSessionBindingListener 리스너 사용법 (0) | 2019.07.14 |
[서블릿/JSP] 톰캣 8.0 이하에서 HTTP Response 메시지에서 Server 값 바꾸기 (0) | 2019.07.10 |
[서블릿/JSP] 서버의 세션 수 제한하는 방법 (0) | 2019.07.09 |