天天看点

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绑定或取消绑定时,就会在控制台输出相关内容。