概述

与HttpSession相关的监听器有四个:分别是HttpSessionListener、HttpSessionAttributeListener、HttpSessionBindingListener与HttpSessionActivationListener。


HttpSessionListener

HttpSessionListener是“生命周期监听器”,在HttpSession对象初始化后或结束前,会分别调用sessionCreated()与sessionDestroyed()方法,并传入的HttpSessionEvent,我们可以使用HttpSessionEvent的getSession()取得HttpSession。

声明

方法一:在实现HttpSessionListener的类上标注@WebListener

@WebListener()
public class SomeSessionListener implements HttpSessionListener {}

java Code

方法二:在web.xml中声明

    <listener>
<listener-class>cc.openhome.SomeSessionListener</listener-class>
</listener>

xml Code

应用

假设有个应用程序在用户登录后会使用HttpSession对象来进行会话管理。如果想要在应用程序中加上显示目前已登录在线人数的功能,就可以实现HttpSessionListener接口。例如:

@WebListener()
public class LoginSessionListener implements HttpSessionListener {
private static int count; public static int getCount() {
return count;
} @Override
public void sessionCreated(HttpSessionEvent se) {
LoginSessionListener.count++;
} @Override
public void sessionDestroyed(HttpSessionEvent se) {
LoginSessionListener.count--;
}
}

java Code

可以把这个例子进一步扩充,不只统计在线人数,还可以实现一个查看在线用户信息的列表。


HttpSessionAttributeListener

HttpSessionAttributeListener是“属性改变监听器”,当在会话对象中加入、移除或替换属性时,相对应的attributeAdded()、attributeRemoved()与attributeReplaced()方法就会被调用,并分别传入HttpSessionBindingEvent。HttpSessionBindingEvent有个getName()方法,可以取得属性设置或移除时指定的名称,而getValue()可以取得属性设置或移除时的对象。

声明

方法一:在实现HttpSessionAttributeListener的类上标注@WebListener

@WebListener()
public class HttpSessionAttrListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
//...
} @Override
public void attributeRemoved(HttpSessionBindingEvent event) {
//...
} @Override
public void attributeReplaced(HttpSessionBindingEvent event) {
//...
}
}

java Code

方法二:在web.xml中声明

<web-app...>
...
<listener>
<listener-class>cc.openhome.HttpSessionAttrListener</listener-class>
</listener>
...
<web-app>

xml Code


HttpSessionBindingListener

HttpSessionBindingListener是“对象绑定监听器”,当实现此接口的对象被加入HttpSession或从中移除时,就会收到通知,并调用对应的valueBound()与valueUnbound()方法,且传入HttpSessionBindingEvent对象,我们可以通过该对象的getSession()取得HttpSession对象。

声明

这个监听器的实现类不需要通过注释或在web.xml中声明。

Demo

当用户输入正确的名称与密码时,创建User实例,并加入HttpSession。如果我们希望这时程序自动从数据库中加载用户的其他数据,如地址、照片等,或是在日志中记录用户登录的信息,可以让User类实现HttpSessionBindingListener接口,在valueBound()方法中,实现查询数据库并补齐User对象中的相关数据等功能。

package com.test;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; @WebServlet("/login")
public class Login extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
doPost(request, response);
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
String name = request.getParameter("name");
String passwd = request.getParameter("passwd");
// 假设用户的名称和密码都正确
User user = new User();
user.setName(name);
user.setPasswd(passwd);
// 加入session
HttpSession session = request.getSession();
session.setAttribute("UUID", user);
// 检查属性有没有补全
User user2 = (User) session.getAttribute("UUID");
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
System.out.println(user2);
response.getWriter().write(user2.toString());
}
}

Login Servlet

package com.test;

import javax.servlet.*;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener; @WebListener
public class User implements HttpSessionBindingListener {
private String name;
private transient String passwd;
private String sex;
private Integer age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", passwd='" + passwd + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
try {
Thread.sleep(1000); // 测试这个方法是不是阻塞的。结果:是阻塞的,页面一直会等待
} catch (InterruptedException e) {
e.printStackTrace();
}
User user = (User) event.getValue();
user.setAge(18);
user.setSex("女");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) { }
}

User 实体类

测试地址

http://127.0.0.1/login?name=zs&passwd=123

测试结果

User{name='zs', passwd='123', sex='女', age=18}


HttpSessionActivationListener

HttpSessionActivationListener是“对象迁移监听器”,其中定义了两个方法sessionWillPassivate()、sessionDidActivate()。很多情况下,几乎不会使用到HttpSessionActivationListener。在使用到分布式环境时,应用程序的对象可能分散在多个JVM中。当HttpSession要从一个JVM迁移至另一个JVM时,必须先在原本的JVM上序列化所有的对象,在这之前若对象有实现HttpSessionActivationListener,就会调用sessionWillPassivate()方法,如果HttpSession中有些对象类成员无法作序列化,就可以做些替代处理。而HttpSession迁移至另一个JVM后,会对所有对象作反序列化,此时会调用sessionDidActivate()方法。

与HttpSession相关的监听器的更多相关文章

  1. 与ServletContext相关的监听器

    概述 与ServletContext相关的监听器有ServletContextListener与ServletContextAttributeListener. ServletContextListe ...

  2. HttpSession相关API

    //获取Session对象 request.getSession() request.getSession(boolean create) //获取SessionId getId() //获取当前se ...

  3. jsp 监听器

    Servlet API提供了一系列的事件和事件监听接口. 上层的servlet/JSP应用能够通过调用这些API进行事件 驱动的开发.这里监听的所有事件都继承自 java.util.Event对象.监 ...

  4. 【Servlet】1、Servlet监听器及相关接口

    Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前.发生后可以做一些必要的处理. 接口: 目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,其中Ht ...

  5. JavaWeb监听器详解

    1 JavaWeb监听器概述 在JavaWeb被监听的事件源为:ServletContext.HttpSession.ServletRequest,即三大域对象.有监听域对象"创建" ...

  6. JavaWeb笔记——三大组件之监听器

    1 JavaWeb监听器概述 在JavaWeb被监听的事件源为:ServletContext.HttpSession.ServletRequest,即三大域对象. l  监听域对象“创建”与“销毁”的 ...

  7. 监听器Listener

    监听器 6个事件类,均以event结尾 *某些操作,如启动/关闭容器,创建/销毁会话,都将触发一种事件发生,当发生了某种事件,容器将创建对应的事件类对象 8个监听接口,均以Listener结尾 监听器 ...

  8. Servlet 应用程序事件、监听器

    Web容器管理Servlet/JSP相关的生命周期,若对HttpServletRequest对象.HttpSession对象.ServletContxt对象在生成.销毁或相关属性设置发生的时机点有兴趣 ...

  9. JavaWeb学习笔记八 监听器

    监听器Listener jservlet规范包括三个技术点:servlet :listener :filter:监听器就是监听某个对象的的状态变化的组件.监听器的相关概念事件源: 被监听的对象(三个域 ...

随机推荐

  1. opencv实现canopy算法

    #include "stdafx.h" using namespace cv; int main(int argc, char** argv) { Mat img=imread(& ...

  2. C#:多线程、线程同步与死锁

    推荐阅读: C#线程系列讲座(1):BeginInvoke和EndInvoke方法 C#线程系列讲座(2):Thread类的应用 C#线程系列讲座(3):线程池和文件下载服务器 C#线程系列讲座(4) ...

  3. 【从0到1学Web前端】CSS定位问题一(盒模型,浮动,BFC) 分类: HTML+CSS 2015-05-27 22:24 813人阅读 评论(1) 收藏

    引子: 在谈到css定位问题的时候先来看一个小问题: 已知宽度(假如:100px)div框,水平居中,左右两百年的分别使用div框填充.且左右div自适应. 效果如下图: 这个问题的难点主要是浏览器宽 ...

  4. Java 并发优化

    线程不安全 SimpleDateFormat不是线程安全的 SimpleDateThread import java.text.ParseException; import java.text.Sim ...

  5. Git和Gitlab协同工作

    1.概述 在写这篇博客之前,为了更好的描述整个流程,本人亲自尝试了:从搭建到使用,下面就围绕这个流程来阐述整个过程,目录结构如下所示: Git的安装搭建 Git的常规操作 Gitlab的搭建 Gitl ...

  6. Nginx+uwsgi+Django 的web应用环境部署-完整记录

    Python作为当前最火爆最热门,也是最主要的Web开发语言之一,在其二十多年的历史中出现了数十种Web框架,比如Django.Tornado.Flask.Twisted.Bottle和Web.py等 ...

  7. Docker轻量级web图形页面管理 - Portainer部署记录

    Docker图形页面管理工具基本常用的有三种: Docker UI,Shipyard,Portainer,之前分别介绍了Docker UI和Shipyard部署,下面简单介绍下Portainer部署. ...

  8. Java 容器源码分析之集合类详解

    集合类说明及区别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └W ...

  9. Linux下Nginx访问web目录提示403Forbidden

    在Linux下http服务器nginx时,访问web目录提示403 Forbidden,首先需要了解nginx出现403错误是什么意思: 403 Forbidden表示你在请求一个资源文件但是ngin ...

  10. JS DOM操作(二) Window.docunment对象——操作样式

    一 对元素的定位 在 js 中可以利用 id.class.name.标签名进行元素的定位 id.class  用在客户端 name  用在服务端 用 id 定位                  -- ...