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):

輸出信息以下:

對比一下第一次訪問時的信息,發現徹底同樣的

相關文章
相關標籤/搜索