欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

与HttpSession有关的四个监听器之间的区别

程序员文章站 2022-05-01 11:34:09
...

HttpSession有关的四个监听器之间的区别

简介:HttpSession常用的四个监听器HttpSessionBindingListenerHttpSessoinActivationListenerHttpSessionListenerHttpSessionAttributeListener的区别

 

一、HttpSessionListener和HttpSessionAttributeListener的区别

1.HttpSessionListener:
        HttpSessionListener是对Session的一个监听,主要监听关于Session的两个事件,即初始化和销毁。针对所有的Sessoin
接口HttpSessionListener有两个方法,分别为:

      VoidsessionCreated(HttpSessionEvent se):当session创建时会收到通知。

      VoidsessionDestroyed(HttpSessionEvent se):当session销毁时也会收到通知。

2.HttpSessionAttributeListener
       HttpSessionAttributeListenerSessionAttribute的监听,当在会话对象中加入属性、移除属性或替换属性时,就会调用HttpSessionAttributeListener监听器。可以和HttpSessionBindingEvent合作着使用。也是针对所有的Sessoin


接口HttpSessionAttributeListener3个方法:

    public voidattributeAdded(HttpSessionBindingEvent se):在session中添加对象时触发此操作
    public voidattributeRemoved(HttpSessionBindingEvent se):修改、删除session中添加对象时触发此操作
    public voidattributeReplaced(HttpSessionBindingEvent se):在Session属性被重新设置时

注意:使用这两个监听器接口需要配置web.xml文件

<listener>    

     <listener-class>监听器的全类名</listener-class>    

</listener>  

总结:

相同点:只需要设置到web.xml中就可以监听整个应用中的所有session

不同点HttpSessionListener只是监听session的创建和销毁,而

HttpSessionAttributeListener是监听Session的属性的添加、修改和删除。

二、HttpSessionListenerHttpSessionBindingListener的区别

1.配置

HttpSessionListener需要在web.xml中配置才能使用

HttpSessionBindingListener不需要配置。

 

2. 使用方式和监听范围

HttpSessionListener需要实例化后设置到web.xml中就可以使用,监听整个应用中的所有session

HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。通常都是一对一的监听


总结:如果一个对象想要在自身被绑定到session或者从session中解绑的时候得到通知,则该对象需要实现HttpSessionBindingListener监听器。该监听器的实现类不需要再部署描述文件中配置。

可以用来自作用户列表:

我们可以让每个listener对应一个username,这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。

 

三、HttpSessionBindingListenerHttpSessionActivationListener的区别。

 

(实现这两个接口的类不需要 web.xml文件中进行注册)

 

1.实现HttpSessionBindingListener接口

 

实现了HttpSessionBindingListener接口的JavaBean 对象可以感知自己被绑定到Session 中和从Session 中删除的事件:

 

绑定对象:

当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的  void valueBound(HttpSessionBindingEvent event)方法

 

当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的void valueUnbound(HttpSessionBindingEvent event)方法

 

 

2.实现httpSessionActivationListenter接口:

实现了HttpSessionActivationListener接口的JavaBean 对象可以感知自己被活化和钝化的事件

 

当绑定到HttpSessoion 对象中的对象将要随HttpSession对象被钝化之前,web服务器调用如下方法,

sessionWillPassivate(HttpSessionBindingEvent event)方法;

 

当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后,web服务器调用该对象的

 void sessionDidActive(HttpSessionBindingEvent event)方法

 

活化和钝化:

1. (钝化) Session对象持久化到一个存储设备中

2. (活化) Session对象从一个存储设备中恢复

 

 

(注意:实现HttpSessionActivationListener接口还必须实现Serializable序列化接口。

总结:

 

使用的情景不同:

HttpSessionBindingListener是在绑定到Session中,从 Session域中解除绑定时使用。(在内存中)

HttpSessionActivationListener是在对象活化和钝化时时候用(磁盘和内存)。

 

实例利用HttpSessionBindingListener制作在线列表

Jsp代码

 

1

2

3

4

5

6

7

8

9

10

11

12

<%@page import="com.test.OnlineUserBindingListener"%>

<%@ page contentType="text/html;charset=utf-8"%>

<%@ page import="java.util.*"%>

<%

    request.setCharacterEncoding("UTF-8");

    // 取得登录的用户名

    String username = request.getParameter("username");

       // 把用户名放入在线列表

    session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));

    // 成功

    response.sendRedirect("result.jsp");

%>

 

Java代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

 

package com.test;

 

import java.util.ArrayList;

import java.util.List;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpSessionBindingEvent;

import javax.servlet.http.HttpSessionBindingListener;

 

public class OnlineUserBindingListenerimplements HttpSessionBindingListener {

    String username;

     

    public OnlineUserBindingListener(String username){

        this.username=username;

    }

    public void valueBound(HttpSessionBindingEvent event) {

        HttpSession session = event.getSession();

        ServletContext application = session.getServletContext();

        // 把用户名放入在线列表

        List onlineUserList = (List) application.getAttribute("onlineUserList");

        // 第一次使用前,需要初始化

        if (onlineUserList == null) {

            onlineUserList = new ArrayList();

            application.setAttribute("onlineUserList", onlineUserList);

        }

        onlineUserList.add(this.username);

    }

 

    public void valueUnbound(HttpSessionBindingEvent event) {

        HttpSession session = event.getSession();

        ServletContext application = session.getServletContext();

 

        // 从在线列表中删除用户名

        List onlineUserList = (List) application.getAttribute("onlineUserList");

        onlineUserList.remove(this.username);

        System.out.println(this.username +"退出。");

 

    }

 

}