监听对象与session的绑定与解绑

接口:HttpSessionBindingListener

监听一个类实例何时被添加到session域中,何时移除了session域。

此监听器不用配置web.xml

/*** 监听session属性对象的绑定与解绑* @author 1**/
public class Bean implements HttpSessionBindingListener {private String name;private String pwd;public Bean(String name,String pwd) {this.name = name;this.pwd= pwd;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("session绑定对象:"+event.getName());}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("session解绑对象:"+event.getName());}}

当调用session.setAttribute(“name”,bean);时,自动调用valueBound提示对象与session绑定。

当调用session.remove()时自动调用valueUnbound提示对象以与session解绑。

Session 的钝化与活化

场景:服务器宕机,钝化活化保证数据不丢失。

首先要理清楚活化与钝化的本质——就是序列化与反序列化。

钝化:简单来说, 就是将session对象从内存中存到硬盘。

活化:将session对象从硬盘中读取。session获取某一对象时, 先从内存中寻找, 若内存中不存在, 则直接尝试从钝化的文件中寻找。

这样做的好处是当服务器突然宕机,将session的数据保留(钝化),重启之后可以直接使用(活化)。

监听session对象的钝化、活化需要使用到 HttpSessionActivationListener 接口。

钝化

当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下,这个过程叫做Session 的钝化。

活化

当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象,这个过程叫做Session的活化。

钝化与活化注意事项

  1. 想要随着Session 被钝化、活化的对象它的类必须实现Serializable 接口,还有要注意的是只有在服务器正常关闭的条件下,还未超时的Session 才会被钝化成文件。当Session 超时、调用invalidate 方法或者服务器在非正常情况下关闭时,Session 都不会被钝化,因此也就不存在活化。
  2. 在被钝化成“SESSIONS.ser” 文件时,不会因为超过Session 过期时间而消失,这个文件会一直存在,等到下一次服务器开启时消失。
  3. 当多个Session 被钝化时,这些被钝化的Session 都被保存在一个文件中,并不会为每个Session 都建立一个文件。

演示 1

第一步
首先我们先创建一个监听器

package Listener;import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;public class ActiveListener implements HttpSessionActivationListener, Serializable {private int num;private String user;public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getUser() {return user;}public void setUser(String user) {this.user = user;}//监听时刻:即将钝化之前@Overridepublic void sessionWillPassivate(HttpSessionEvent se) {System.out.println("即将钝化之前:ActiveListener对象会随着session的钝化而钝化");}//监听时刻:完成活化之后@Overridepublic void sessionDidActivate(HttpSessionEvent se) {System.out.println("活化后:ActiveListener对象会随着session的活化而活化");}
}

由于钝化活化的本质是序列化与反序列化,所以一定要继承 Serializable 接口

第二步
实现session的钝化和活化并不需要配置 web.xml, 但需要配置一个名为 context.xml 的文件
该文件存放的位置默认是在项目的 tomcat 文件夹中
例如:
/tomcat/项目名/conf/context.xml
找到之后将它打开
并在中加入如下字段:

//maxIdleSwap表示session最大持续多少秒后自动从内存转入硬盘<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="5">
//directory表示存放session文件的路径<Store className="org.apache.catalina.session.FileStore" directory="D:\session"> </Store></Manager>

至于 org.apache.catalina.session.PersistentManager 与 org.apache.catalina.session.FileStore 这里不做过多说明,要详细了解请参考http://blog.sina.com.cn/s/blog_960b18410102v54r.html
这样基本的配置已经完成了

第三步
创建两个简单的JSP
write.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%ActiveLister bean=new ActiveLister();bean.setNum(10);bean.setUser("zs");session.setAttribute("bean",bean);
%>
</body>

read.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>活化后:num:${sessionScope.bean.num}user:${sessionScope.bean.user}
</body>

一个用于session的写入硬盘,一个用于session从硬盘读取

第四步
接下来就是运行了
首先先运行 write.jsp

虽然在 context.xml 中配置的时间是5s —— maxIdleSwap=“5”
但实际上由于服务器初始化等问题可能等待的时间不止5s

接下来重新打开tomcat服务器, 运行 read.jsp

这样就简单实现了session的钝化与活化。

演示 2

定义两个Servlet ,在一个Servlet 中将“username” 保存在Session 中,另一个Servlet 中获取到该“username”,输出到浏览器。

SessionServlet1

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/session1")
public class SessionServlet1 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//将username = zhangsan 保存在Session 中request.getSession().setAttribute("username", "zhangsan");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

SessionServlet12

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/session2")
public class SessionServlet2 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取到username 输出到浏览器String username = (String) request.getSession().getAttribute("username");response.getWriter().write(username);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}




注:由于String 类本身已经实现了序列化接口“java.io.Serializable”,因此会被钝化成文件。如果我们想要自己定义的“POJO”类也可以钝化与活化,那么也必须要实现“java.io.Serializable”接口。这也是为什么我们建议将“POJO”类都实现序列化接口的一个原因。

session 对象的绑定、解绑和钝化、活化相关推荐

  1. 44session绑定解绑、钝化活化

    BeanListener监听绑定或者解绑 HttpSessionActivationListener,Serializable 监听钝化活化 Serializable接口拿来实现获取session里面 ...

  2. jquery事件绑定解绑机制源码分析

    引子 为什么Jquery能实现不传回调函数也能解绑事件?如下: $("p").on("click",function(){alert("The par ...

  3. uniapp 账号登陆,账号绑定/解绑流程,躺坑

    第一次开发uniapp微信小程序,记录一下开发中遇到的流程以及坑 账号登陆 1.uni.login 获取code,在调用接口传入code获取uKey 绑定账号/解绑 1.uni.login获取code ...

  4. JQuery事件绑定解绑方法小结

    常用的方法 绑定:bind().delegate().on() 解绑:unbind().undelegate().off() 此外还有live() 不过JQuery1.9及其以上版本删除了此方法 推荐 ...

  5. linux 网卡绑定解绑,网卡绑定开机绑定,关机解绑

    Linux下实现双网卡负载均衡系统环境:RHEL5根据甘肃兰州实际情况的双网卡绑定方案, 方案思路:开机绑定,关机解绑 一.建立虚拟网络接口ifcfg-bond0文件[root@yangwenjun ...

  6. uniapp Apple iOS 绑定解绑

    绑定 uni.login 拉起Apple的登录授权,获取返回的唯一标识:res.authResult.openid 请求后端服务,保存绑定状态 提示:操作成功 解绑 uni.showModal确认弹框 ...

  7. 华为云如何绑定/解绑二次验证码/虚拟MFA/谷歌身份验证器?

    工具 华为云平台 微信小程序二次验证码 方法 登陆华为云平台,点击账户名,点击"安全设置" 点击"虚拟MFA"中的"立即绑定",进行绑定 无 ...

  8. 阿里云绑定解绑第三方支付宝,淘宝账号

    阿里云上有个一直常用的很早注册的一个账号,后来支付宝登录授权又自动生成了一个账号弄成了两个账号,始终没有找到绑定和解绑支付宝账号的功能,找了人工客服,响应很神速,貌似部分用户的账号在安全设置页面账号名 ...

  9. python web开发-flask中response,cookies,session对象使用详解

    Response响应对象: 当一个web请求被服务器处理完后,会返回用户请求的响应,这时候就要用到响应对象,根据响应给用户的形式不同,响应对象有以下几种处理方式 如果返回的是一个合法的响应对象,它会从 ...

  10. 微信绑定/解绑设备ticket

    在微信绑定和解绑的时候需要一个ticke来进行该过程 可是一直没有获取到ticket  一直都是返回fail 后来发现原来是需要在 原来是需要初始化设备库,才能或得到ticket

最新文章

  1. Codeforces Round #640 (Div. 4)(ABCDEG题解)
  2. 分布式内存数据库 Geode
  3. iphone6 iphone6 plus 放大显示模式高分辨率模式问题
  4. 大数据如何学习 cda认证_第十届CDA认证考试 LEVEL 1 优秀考生访问录:我是如何备考的?...
  5. python从入门到精通pdf百度云下载-跟老齐学Python从入门到精通 电子版(pdf格式)...
  6. 多种分布式文件系统简介
  7. C语言二维数组的指针写法
  8. 【python进阶】_正则表达式
  9. vue8种组件通信方式
  10. 两个点击事件共用一个方法_工作必技:教你简单方法一个电脑开两个,多个微信!...
  11. P5725 【深基4.习8】求三角形(python3实现)
  12. 实例:用户登录(python 版)
  13. Linux基础——操作系统框架
  14. Oracle PL/SQL 存储过程
  15. java 求集合真子集_干货 | 集合与函数概念知识点总结
  16. 全球十九大主流卫星遥感数据下载平台
  17. Spring事务和事务传播机制
  18. js前端实现ios12和ios13+摇一摇功能
  19. 漂亮女人美丽秘诀------猕猴桃(奇异果)
  20. 三峡学院计算机调剂,重庆三峡学院2019考研预调剂公告

热门文章

  1. 王之泰201771010131《面向对象程序设计(java)》第四周学习总结
  2. 干货丨DolphinDB即时编译(JIT)详解
  3. swift学习之数组、字典和字符串
  4. 《穿透:像社会学家一样思考》简述
  5. Mybatis“四大神兽”
  6. 手机微信中的文档存放位置
  7. Linux学习之计划任务(at、batch、crontab)篇
  8. Ubuntu 下查看图片
  9. 跟张志东深聊,腾讯的“进化力”
  10. 《P2P技术详解》系列文章