Session 監聽器
有四個監聽器接口與HttpSession有關,分别為:
HttpSessionListener
HttpSessionActivationListener
HttpSessionAttributeListener
HttpSessionBindingListener
1. HttpSessionListener
當HttpSession被建立或者被銷毀時,Servlet容器就會調用所有已經注冊的HttpSessionListener。
例子
java代碼
public class SessionListener implements HttpSessionListener,ServletContextListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
HttpSession session = se.getSession();
ServletContext servletContext = session.getServletContext();
//AtomicInteger是在使用非阻塞算法實作并發控制
AtomicInteger userCounter = (AtomicInteger) servletContext.getAttribute("userCounter");
int userCount = userCounter.decrementAndGet();
System.out.println("userCount decreamented to:"+userCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
HttpSession session = se.getSession();
ServletContext servletContext = session.getServletContext();
AtomicInteger userCounter = (AtomicInteger) servletContext.getAttribute("userCounter");
int userCount = userCounter.decrementAndGet();
System.out.println("----------------userCount decreamented to:"+userCount);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
ServletContext servletContext = sce.getServletContext();
servletContext.setAttribute("userCounter", new AtomicInteger());
}
可以看見,SessionListener實作了兩個接口。
其中AtomicInteger的初始值為0,表示使用者剛啟動時的使用者數為0,
其對象以原子方式将此更新器管理的給定對象的字段的目前值減 1。
将該監聽器注冊到部署,通路界面,可以看到控制台輸出
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQ3chVEa0V3bT9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwleBpXTz0keOFTT6hVdsdUZwZlMkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DN0AzM1QTNzEzNwgDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
從同一個浏覽器再次送出請求時,userCounter的值不會發生變化,因為它與同一個HttpSession關聯。但是使用不同浏覽器通路時,這個值就會增加,值得注意的是:銷毀HttpSession之前調用sessionDestroyed方法,它的userCounter值是遞減的。
2. HttpSessionActivationListener
每當HttpSession中添加,删除或替換了某個屬性時,ServletContextAttributeListener的實作都會收到通知,
該監聽器接口種有三個方法:
void attributeAdded(HttpSessionBindingEvent event)
void attributeRemoveed(HttpSessionBindingEvent event)
void attributeReplaced(HttpSessionBindingEvent event)
擷取屬性名和屬性值,使用以下兩個方法
java.lang.String getName()
java.lang.Object getValue()
3.HttpSessionAttributeListener
在分布式環境中,多個Servlet會配置成可伸縮性的,為節省記憶體,Servlet可對session進行遷移或序列化,這個接口中有;兩個方法
包含這個對象的HttpSession被激活就調用:
void sessionDidActivate(HttpSessionEvent event)
包含這個對象的HttpSession被鈍化就調用:
void sessionWillPassivate(HttpSessionEvent event)
4. HttpSessionBindingListener
當HttpSessionBindingListener綁定到HttpSession或者取消綁定時,就會收到通知。
例子:
public class Banding implements HttpSessionBindingListener{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String attributeName = event.getName();
System.out.println(attributeName+" valueBinding");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
String attributeName = event.getName();
System.out.println(attributeName+" valueUnBinding");
}
}
當監聽器與HttpSession綁定或取消綁定時,就會在控制台輸出相關内容。