Servlet规范系列 之 HttpSession事件分析

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

  HttpSession的生命周期过程中,HttpSession的每次变动都可以进行监控,Servlet API提供了丰富的针对HttpSession的监听器:

  · HttpSessionListener:当HttpSession创建或销毁时触发相应的事件。

  · HttpSessionActivationListener:当HttpSession钝化(序列化)或激活(反序列化)是触发相应的事件。

  · HttpSessionAttributeListener:当在HttpSession中添加、移除或更改属性值时会触发相应的事件。

  · HttpSessionBindingListener:实现HttpSessionBindingListener接口的对象被绑定到HttpSession时触发valueBound事件,解除绑定时触发valueUnbound事件。这个监听和HttpSessionAttributeListener的区别还是较大的,HttpSessionAttributeListener针对的是所有可绑定到HttpSesesion中的对象。HttpSessionBindingListener则是要求对象必须实现了HttpSessionBindingListener接口。

  依照本系列的原则,主要分析Servlet API的源码,让我们一起看一下。

  HttpSessionEvent

  HttpSessionEvent是HttpSessionListener和HttpSessionActivationListener的事件类,其中包含了被创建或被销毁的HttpSession对象和被钝化(序列化)或激活(反序列化)的HttpSession对象,如下:

package javax.servlet.http;

/**
 * 表示web应用程序中会话更改的事件通知的类.
 */
public class HttpSessionEvent extends java.util.EventObject {
    
    

    /**
     * Construct.
     * @param source HttpSession.
     */
    public HttpSessionEvent(HttpSession source) {
    
    
        super(source);
    }

    /**
     * 获取事件里的HttpSession.
     * @return HttpSession.
     */
    public HttpSession getSession() {
    
    
        return (HttpSession) super.getSource();
    }

}

  HttpSessionListener

  HttpSessionListener在HttpSession被创建或被销毁时触发,如下图:

package javax.servlet.http;

import java.util.EventListener;

/**
 * 当Web应用程序的活动会话列表发生变化时,会通知此接口的实现.
 * 要接收通知事件,必须在Web应用程序的部署描述符中配置实现类.
 */
public interface HttpSessionListener extends EventListener {
    
    
    
	/** 
	* session创建时通知.
	* @param HttpSessionEvent事件.
	*/
    public void sessionCreated ( HttpSessionEvent se );
    
	/** 
	* session销毁时通知.
	* @param HttpSessionEvent事件.
	*/
    public void sessionDestroyed ( HttpSessionEvent se );
    
}

  HttpSessionActivationListener

  HttpSessionActivationListener在HttpSession被钝化(序列化)或激活(反序列化)时触发,如下图:

package javax.servlet.http;

/**
 * 表示web应用程序中会话更改的事件通知的类.
 */
public class HttpSessionEvent extends java.util.EventObject {
    
    

    /**
     * Construct.
     * @param source HttpSession.
     */
    public HttpSessionEvent(HttpSession source) {
    
    
        super(source);
    }

    /**
     * 获取事件里的HttpSession.
     * @return HttpSession.
     */
    public HttpSession getSession() {
    
    
        return (HttpSession) super.getSource();
    }

}

  HttpSessionBindingEvent

  HttpSessionBindingEvent是HttpSessionAttributeListener和HttpSessionBindingListener的事件类,包含了属性的名称和属性的值,如下:

package javax.servlet.http;

/**
 * HttpSessionBindingEvent由HttpSessionBindingListener和HttpSessionAttributeListener公用.
 * 在会话中绑定或取消绑定时,HttpSessionBindingEvent发送给HttpSessionBindingListener.
 * 当在会话中绑定、取消绑定或替换任何属性时,HttpSessionBindingEvent发送给HttpSessionAttributeListener. 
 * 
 * 会话通过调用HttpSession.setAttribute并解除对象绑定,
 * 通过调用HttpSession.removeAttribute.
 */
public class HttpSessionBindingEvent extends HttpSessionEvent {
    
    

    /**
     * 要绑定或取消绑定对象的名称.
     */
    private String name;

    /**
     * 要绑定或取消绑定对象.
     */
    private Object value;

    /**
     * Constructs.
     * @param HttpSession实例.
     * @param 要绑定或取消绑定对象的名称.
     */
    public HttpSessionBindingEvent(HttpSession session, String name) {
    
    
        super(session);
        this.name = name;
    }

    /**
     * Constructs.
     * @param HttpSession实例.
     * @param 要绑定或取消绑定对象的名称.
     * @param 要绑定或取消绑定对象.
     */
    public HttpSessionBindingEvent(HttpSession session, String name, Object value) {
    
    
        super(session);
        this.name = name;
        this.value = value;
    }

    /**
     * 获得HttpSession.
     */
    public HttpSession getSession() {
    
    
        return super.getSession();
    }

    /**
     * 获得要绑定或取消绑定对象的名称.
     */
    public String getName() {
    
    
        return name;
    }

    /**
     * 获得要绑定或取消绑定对象.
     */
    public Object getValue() {
    
    
        return this.value;
    }

}

  HttpSessionAttributeListener

  HttpSessionAttributeListener在HttpSession中添加、移除或更改属性值时触发,如下:

package javax.servlet.http;

import java.util.EventListener;

/**
 * 可以实现此侦听器接口,以便获取此web应用程序中会话的属性列表更改的通知.
 */
public interface HttpSessionAttributeListener extends EventListener {
    
    
    
    /**
     * 属性已添加到会话的通知.在添加属性后调用.
     * @param HttpSessionBindingEvent.
     */
    public void attributeAdded(HttpSessionBindingEvent se);

    /**
     * 已从会话中删除属性的通知.在移除属性后调用.
     * @param HttpSessionBindingEvent.
     */
    public void attributeRemoved(HttpSessionBindingEvent se);

    /**
     * 通知中的属性已被替换.在替换属性后调用.
     * @param HttpSessionBindingEvent.
     */
    public void attributeReplaced(HttpSessionBindingEvent se);

}

  HttpSessionBindingListener

  HttpSessionBindingListener在实现HttpSessionBindingListener接口的对象被绑定或解绑是触发,如下:

package javax.servlet.http;

import java.util.EventListener;

/**
 * 使对象在绑定到会话或从会话解除绑定时得到通知. 
 * 对象由HttpSessionBindingEvent对象通知. 
 * 可能由于Servlet显式地从会话中解除了属性绑定,或者由于会话失效或会话超时而导致的.
 */
public interface HttpSessionBindingListener extends EventListener {
    
    

    /**
     * 通知对象它正被绑定到会话并标识该会话.
     * @param HttpSessionBindingEvent.
     */
    public void valueBound(HttpSessionBindingEvent event);

    /**
     * 通知对象它正在从会话解除绑定并标识会话.
     * @param HttpSessionBindingEvent.
     */
    public void valueUnbound(HttpSessionBindingEvent event);

}

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/108046809
今日推荐