天天看點

Servlet 監聽器----Session

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。

将該監聽器注冊到部署,通路界面,可以看到控制台輸出

Servlet 監聽器----Session

從同一個浏覽器再次送出請求時,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綁定或取消綁定時,就會在控制台輸出相關内容。