与HttpSession相关的监听器
概述
与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相关的监听器的更多相关文章
- 与ServletContext相关的监听器
概述 与ServletContext相关的监听器有ServletContextListener与ServletContextAttributeListener. ServletContextListe ...
- HttpSession相关API
//获取Session对象 request.getSession() request.getSession(boolean create) //获取SessionId getId() //获取当前se ...
- jsp 监听器
Servlet API提供了一系列的事件和事件监听接口. 上层的servlet/JSP应用能够通过调用这些API进行事件 驱动的开发.这里监听的所有事件都继承自 java.util.Event对象.监 ...
- 【Servlet】1、Servlet监听器及相关接口
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前.发生后可以做一些必要的处理. 接口: 目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,其中Ht ...
- JavaWeb监听器详解
1 JavaWeb监听器概述 在JavaWeb被监听的事件源为:ServletContext.HttpSession.ServletRequest,即三大域对象.有监听域对象"创建" ...
- JavaWeb笔记——三大组件之监听器
1 JavaWeb监听器概述 在JavaWeb被监听的事件源为:ServletContext.HttpSession.ServletRequest,即三大域对象. l 监听域对象“创建”与“销毁”的 ...
- 监听器Listener
监听器 6个事件类,均以event结尾 *某些操作,如启动/关闭容器,创建/销毁会话,都将触发一种事件发生,当发生了某种事件,容器将创建对应的事件类对象 8个监听接口,均以Listener结尾 监听器 ...
- Servlet 应用程序事件、监听器
Web容器管理Servlet/JSP相关的生命周期,若对HttpServletRequest对象.HttpSession对象.ServletContxt对象在生成.销毁或相关属性设置发生的时机点有兴趣 ...
- JavaWeb学习笔记八 监听器
监听器Listener jservlet规范包括三个技术点:servlet :listener :filter:监听器就是监听某个对象的的状态变化的组件.监听器的相关概念事件源: 被监听的对象(三个域 ...
随机推荐
- flex布局下, 内容改变 不重新渲染问题
当使用flex布局时,flex内元素包含的内容改变时,浏览器不会进行重新渲染, 答案引用 http://stackoverflow.com/questions/23474191/flexbox-hei ...
- linux zip命令
linux zip 命令详解 功能说明:压缩文件. 语 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串& ...
- Java 中的队列 Queue
一.队列的定义 我们都知道队列(Queue)是一种先进先出(FIFO)的数据结构,Java中定义了java.util.Queue接口用来表示队列.Java中的Queue与List.Set属于同一个级别 ...
- VS和Eclipse的调试功能哪个更强大?
以前一直用VS 2012来调试C/C++代码,F5.F10.F11用起来甚是顺手,前面也写过一篇关于VS最好用的快捷键:Visual Studio最好用的快捷键(你最喜欢哪个), 所以对于调试C/C+ ...
- Mysql - 增量脚本中修改字段属性
在增量部署系统的时候, 经常需要提供增量修改的脚本, 如果是修改存储过程或者自定义函数, 那还是很好改的, 不用担心表功能收到影响. 如果是改字段呢? 首先不知道字段是不是已经在系统里面, 没有的话, ...
- MVC源码分析 - ModelBinder绑定 / 自定义数据绑定
这几天老感觉不对, 总觉得少点什么, 今天才发现, 前面 3 里面, 在获取Action参数信息的时候, 少解析了. 里面还有一个比较重要的东西. 今天看也是一样的. 在 InvokeAction( ...
- [Python学习笔记-003] 使用PyOTP获取基于OTOP算法的动态口令
建立安全的VPN连接,不仅需要输入用户名和密码,还需要输入动态口令(token).作为一个懒人,我更喜欢什么手工输入都不需要,既不需要输入password,也不需要输入token.也就是说,只需一个命 ...
- Leetcode 763. Partition Labels
思路:动态规划.对于属于coins的coin,只要知道amount-coin至少需要多少个货币就能表示,那么amount需要的货币数目=amount-coin需要的货币数目+1:如果amount-co ...
- Flutter踩坑日记:解除依赖
Flutter已经融入工程有一段时间了,由于团队人数较少,所以一直没有管和原有工程解依赖的问题,今天有时间正好把这个问题给搞了. 一.分析 首先,直接忽略上一篇<接入现有iOS项目>的所有 ...
- Centos7 安装字体库&中文字体
1.概述 在安装一些服务的时候,会涉及到字符编码与字体的问题,字符编码一般在数据库或代码级别设置,字体一般是在系统级别设置.如安装使用jira或confluence的时候,使用一些宏的时候经常会出现乱 ...