欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!
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);
}
若文中存在错误和不足,欢迎指正!
本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!