在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/ 欢迎转载,一起技术交流吧!