HttpSessionActivationListener序列化与反序列化
一、序列化与反序列化
1.什么是序列化
-
-
- 把对象转化位字节序列的过程称为序列化(保存到硬盘,持久化)
- 把字节序列转化位对象的过程称为反序列化(存放于内存)
-
2.序列化的用途
-
-
- 把对象的字节序列永久保存到硬盘上,通常放到一个文件中。
- 把网络传输的对象通过字节序列化,方便传输
-
最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
二、HttpSessionActivationListener监听session对象的序列化与反序列化
1.HttpSessionActivationListener用于监控实现类本身,当实现类对象被添加到session中(session.setAttribute())后,session对象序列化(钝化)前和反序列化(活化)后都会被执行,相应的方法。
-
-
- sessionWillPassivate(HttpSessionEvent se) session钝化前执行(session从内存到硬盘)
- sessionDidActivate(HttpSessionEvent se) session活化后执行(session从硬盘到内存)
-
2.我们通过在META-INF目录下配置context.xml文件,设置失效时间和session序列化的保存路径,配置如下:
1 <Context> 2 <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> 3 <Store className="org.apache.catalina.session.FileStore" directory="d:/session"/> 4 </Manager> 5 </Context>
-
-
- maxIdlSwap="1"表示失效时间为1分钟
- directory="d:/session"是session保存路径
-
工程目录结构:

3.然后定义一个类实现HttpSessionActivationListener接口,监听session的序列化,代码如下:
1 public class HttpSessionActivation_Listener implements HttpSessionActivationListener,Serializable { 2 3 private static final long serialVersionUID = -8367567842003252055L; 4 private String name ; 5 6 public void setName(String name) { 7 8 this.name = name; 9 10 } 11 12 public String getName() { 13 return name; 14 } 15 16 public HttpSessionActivation_Listener(String name) { 17 this.name = name; 18 } 19 //对象实例化后保存到session中,当session失效要被序列化前执行,(只有保存到session中的对象才会被监听到) 20 public void sessionWillPassivate(HttpSessionEvent se) { 21 System.out.println(name + "=>Session被序列化到(钝化)到硬盘中,SessionId是:"+se.getSession().getId()); 22 23 } 24 //当session被反序列化后执行 25 public void sessionDidActivate(HttpSessionEvent se) { 26 System.out.println(name + "=>Session被反序列化到(活化)到内存中,SessionId是:"+se.getSession().getId()); 27 } 28 }
4.jsp页面实现:
1 <% 2 session.setAttribute("sessionBean",new HttpSessionActivation_Listener("小Cai先森")); 3 %>
将实现了HttpSessionActivationListener接口的对象实例化后并添加到session中,(只有添加到session中的对象才能监控到session的动态)
启动服务器,运行结果:
a.对服务器请求一次后不在做任何操作,等待一分钟,等session失效。(sessionWillPassivate(HttpSessionEvent se)监听)

b.再次请求,失效了的session被反序列化到内存中,可以继续使用。(sessionDidActivate(HttpSessionEvent se)监听)
序列化文件可以再配置的目录中查看:(这是补充的,所以会和上面的序列id不一样)
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 历时 8 年,我冲上开源榜前 8 了!
· 物流快递公司核心技术能力-海量大数据处理技术
· 四大AI编程工具组合测评
· 关于能否用DeepSeek做危险的事情,DeepSeek本身给出了答案
· 如何在 Github 上获得 1000 star?