1、 session持久化是什么? web服务器把 session中存储的属性存储到本地磁盘或数据库中;
2、为什么需要持久化? 因为 session是服务器维护会话状态的对象,即便客户端关闭连接或客户端长时间没有访问,服务器还依然存储了客户端的访问数据,浪费了服务器资源;
为了提高服务器内存利用率,其会将暂时不活动但未超时的 session对象 存储到本地或数据库(持久化或序列化); 一旦服务器想要恢复 之前某客户的访问状态时,就可以从本地或数据库恢复他们到内存(反序列化);
3、session持久化怎么做 ?
看个荔枝(代码转自张孝祥):
// servlet 持久化
public class PersistentServlet extends HttpServlet
{
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
Student1 student1 = (Student1)session.getAttribute("student1");
if(student1 == null)
{
student1 = new Student1();
student1.setValue(35);
session.setAttribute("student1",student1);
out.println("将student1保存到了Session中!<br>");
}
else
{
out.println("读取student1:" + student1.getValue() + "<br>");
}
Student2 student2 = (Student2)session.getAttribute("student2");
if(student2 == null)
{
student2 = new Student2();
student2.setValue(33);
session.setAttribute("student2",student2);
out.println("将student2保存到了Session中!<br>");
}
else
{
out.println("读取student2:" + student2.getValue() + "<br>");
}
}
}
// 没有实现序列化接口 Serializable
public class Student1
{
private int value = 0;
public void setValue(int value)
{
this.value = value;
}
public int getValue()
{
return value;
}
}
// 实现序列化接口 Serializable
public class Student2 implements Serializable
{
private int value = 0;
public void setValue(int value)
{
this.value = value;
}
public int getValue()
{
return value;
}
}
访问步骤;
1、第一次访问 , 因为session 没有会话信息,所以先保存;
2、点击刷新; 读取第1次访问时,存储的会话信息;
3、这时关闭 tomcat 服务器; tomcat 会把session中的属性从内容持久化到本地文件, 路径 tomcat\work\Catalina\localhost\myweb2
4、再次启动 tomcat 服务器, 再次访问; 这时由于 student1 没有实现Serializable 序列化接口,所以该对象没有被持久化到本地;而 student2 实现了Serializable接口,其信息被持久化到本地,即可以恢复上一次会话;