session活化与钝化

会话的持久化:html

本篇解决一个问题,就是当正在浏览页面的时候服务器忽然关闭,浏览器不关闭,当再次开启服务器时还可以恢复关闭时的页面java

HttpSessionActivationListener 
实现此接口的JavaBean,能够感知本身被活化(从硬盘到内存)和钝化(从内存到硬盘)的过程。
若是须要同时保存Session中的JavaBean则JavaBean也要实现Serializable序列化接口。
实现此接口的JavaBean与HttpSessionBindingListener同样,没必要配置到web.xml中。
要实现此功能,必需要先配置如下信息:web

第一步:书写一个JavaBean,并实现HttpSessionActivationListener接口以下:apache

第二步:JSP页面,判断是否存在Person,若是没有将Person放到Session中:浏览器

第三步:配置Tomcat的Server.xml文件或是将配置好的xml发布文件放到CATALIINA_HOME\conf\Catalina\localhost目录下:tomcat

配置文件以下:
directory=“d:/a”是指Session文件保存的目录。服务器

第四步:测试session

1:屡次开启新的浏览器窗口,并记录SESSIONID。
2:使用shutdown.bat关闭tomcat应用。
3:观察指定的目录下是否存在*.session文件。
4:再次从新启动tomcat,并使用http://localhost:8080/project;jsessionid=xxxxx指定sessionid的方式访问服务器(若是浏览器没关闭的话就不用带上jsessionid)。
5:观察是否为关闭tomcat以前的同一个Session。
6:通常状况下,PersistentManager持久化Session与Cookie共同使用。
7:HttpSessionActivationListener只作为监听类,监听本身是否钝化或是活化。dom

 

示例代码以下:jsp

Person.java

 

  1.  
    package cn.hncu.domain;
  2.  
     
  3.  
    import java.io.Serializable;
  4.  
     
  5.  
    import javax.servlet.http.HttpSessionActivationListener;
  6.  
    import javax.servlet.http.HttpSessionEvent;
  7.  
     
  8.  
    public class Person implements Serializable, HttpSessionActivationListener {
  9.  
    private String name;
  10.  
     
  11.  
    public Person(String name) {
  12.  
    this.name = name;
  13.  
    }
  14.  
     
  15.  
    @Override
  16.  
    public void sessionDidActivate(HttpSessionEvent arg0) {
  17.  
    System.out.println( this+"从硬盘读取并活化了");
  18.  
    }
  19.  
     
  20.  
    @Override
  21.  
    public void sessionWillPassivate(HttpSessionEvent arg0) {
  22.  
    System.out.println( this+"保存到硬盘");
  23.  
    }
  24.  
     
  25.  
    @Override
  26.  
    public String toString() {
  27.  
    return "Person [name=" + name + "]---"+super.toString();
  28.  
    }
  29.  
    }


index.jsp

 

 

  1.  
    <% @page import="java.text.SimpleDateFormat"%>
  2.  
    <%@ page language= "java" import="java.util.*,cn.hncu.domain.Person" pageEncoding="UTF-8"%>
  3.  
     
  4.  
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  5.  
    <html>
  6.  
    <head>
  7.  
    </head>
  8.  
     
  9.  
    <body>
  10.  
    <h2>演示session钝化与活化技术</h2>
  11.  
    <%
  12.  
    if (session.getAttribute("p")==null){
  13.  
    Person p= new Person(""+new Random().nextInt(100));
  14.  
    session.setAttribute( "p", p);
  15.  
    }
  16.  
    System.out.println(session.getId()+ "---"+session.getAttribute("p"));
  17.  
    SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  18.  
    Date d= new Date(session.getCreationTime());
  19.  
    System.out.println(sdf.format(d));
  20.  
    %>
  21.  
    </body>
  22.  
    </html>

 

 

配置xml文件:aa.xml

  1.  
    <Context path= "/sessionActivationWeb" docBase="D:/Workspaces/MyEclipseBlue2014/sessionActivationWeb/WebRoot">
  2.  
    <Manager className= "org.apache.catalina.session.PersistentManager"
  3.  
    saveOnRestart= "true">
  4.  
    <Store className= "org.apache.catalina.session.FileStore"
  5.  
    directory= "d:/a"> </Store>
  6.  
    </Manager>
  7.  
    </Context>

 

而后关于浏览器访问,这里要说一下;就是在浏览器上的http://localhost:8080/的后面要加上的不是项目名,而是上面配置的xml文件的名字,我这里这个文件名是叫aa.xml,所以在访问的时候我输的是http://localhost:8080/aa,所以你能够将这个xml文件的文件名改成你的项目名。

 

第一次启动时输出信息以下:

此时关闭服务器:

d盘a目录下生成以下文件:

此时在其启动服务器,而后刷新浏览器(若浏览器已经关闭,访问时请带上上次访问的jsessionid):

输出信息以下:

对比一下第一次访问时的信息,发现彻底同样的

相关文章
相关标签/搜索