Session的钝化与活化,Java序列化与反序列化,原来是这么回事!

本文详细解析了JavaWeb中Session的钝化与活化机制,解释了服务器如何在重启后保持Session状态,以及Session对象如何在内存与磁盘间进行序列化与反序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在JavaWeb开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),Session信息保存在服务器中,而Cookie信息保存在客户端浏览器中,显然Session比Cookie更安全。
  Session机制其实在很大程度上优化了Cookie的性能,当访问web应用的用户过多时,服务器就会创建非常多的Session对象,如果不对这些Session对象进行处理,Session在失效之前,这些Session对象就会一直驻留在服务器内存中

应用场景

  基本常识Session信息是保存在服务器中,当我重启服务器之后,正常来说整个程序都初始化了!当我们刷新之前打开的浏览器显示的页面,为什么Session对象还在呢??其实这是就是钝化与活化机制的体现!

什么是Session钝化?

  Session在一段时间内没有被使用时,会将当前存在的Session对象序列化到磁盘上,而不再占用服务器内存空间。

  即:session对象与session内的数据一同从【内存序列化到硬盘】的过程,称之为钝化。

  触发时机:关闭服务器时就触发。

  服务器内存 =====>本地硬盘

什么是Session活化?

Session被钝化后,服务器再次调用Session对象时,将Session对象由磁盘中加载到内存中使用。

  session对象与session内的数据一同从【硬盘反序列化到内存】的过程,称之为钝化。

  触发时机:重启服务器时就触发。

  本地硬盘=====>服务器内存

Java序列化& 反序列化

  Java 序列化是指把 Java 对象转换为字节序列的过程,其作用把对象的字节序列永久地保存到硬盘上,例如....\work\Catalina\localhost\Cookie_Session_demo文件夹中。

  Java 反序列化是指把字节序列恢复为 Java 对象的过程,其作用在网络上传送对象的字节序列。

小结

  从上面Session的钝化与活化的概念层面上,我们不难理解,Session对象那么存放在服务器内存,要么本地硬盘中,所以当我们重启服务器后,Session对象依旧存在!!!

操作演示:

  第一步:关闭Tomcat的Servers下Cookie_Session_demo项目工程

在这里插入图片描述

  第二步:查看本地电脑磁盘....\work\Catalina\localhost\Cookie_Session_demo是否存在SESSIONS.ser文件

在这里插入图片描述

  第三步:重启Tomcat的Servers,则无SESSIONS.ser文件,本质是反序列化,Session对象存到服务器内存 !

在这里插入图片描述

  注意:加入我们希望Session域中的对象也能够随Session钝化过程一起序列化到磁盘上,则对象的实现类也必须实现java.io.Serializable接口。不仅如此,如果对象中还包含其他对象的引用,则被关联的对象也必须支持序列化,否则会抛出异常:java.io.NotSerializableException

代码案例

JavaBean–BlogInfo类

package com.codinglin.bean;
public class BlogInfo implements Serializable{
	private String blogger;//博主
	private String website;//网址
	public BlogInfo() {
		super();
	}
	public BlogInfo(String blogger, String website) {
		super();
		this.blogger = blogger;
		this.website = website;
	}
	public String getBlogger() {
		return blogger;
	}
	public void setBlogger(String blogger) {
		this.blogger = blogger;
	}
	public String getWebsite() {
		return website;
	}
	public void setWebsite(String website) {
		this.website = website;
	}
	@Override
	public String toString() {
		return "BlogInfo [blogger=" + blogger + ", website=" + website + "]";
	}
}

GetSessionServlet类

public class GetSessionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		//设置session中BlogInfo对象
		session.setAttribute("blogInfo", new BlogInfo("CURD_CODER_LIN","https://coding0110lin.blog.youkuaiyun.com/"));
		System.out.println("sessionId"+session.getId());
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		doGet(request, response);
	}
}

sessionDemo.jsp页面

<body>
<h2>Session域中的对象随Session钝化测试</h2>
<!-- JSP内置对象 -->
sessionId:<%=session.getId() %><br>
	<a href="GetSessionServlet">获取Session</a><br/> 
	<!-- <a href="ChiSessionServlet">持久化Session</a><br/>  -->
	我的BlogInfo:${sessionScope.blogInfo}
</body>

页面效果

  同样,关闭服务器或重启服务器,会出现序列化和反序列化,即满足Session的钝化与活化机制条件。

在这里插入图片描述

序列化与反序列化细节之处
在这里插入图片描述

注意:String类型已实现java.io.Serializable接口

public final class java.lang.String implements java.io.Serializable, java.lang.Comparable, java.lang.CharSequence {}

 ☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!

☞本人博客:https://coding0110lin.blog.youkuaiyun.com/  欢迎转载,一起技术交流吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值