1. 程式人生 > >JavaWeb-會話的持久化:HttpSessionActivationListener 活化與鈍化

JavaWeb-會話的持久化:HttpSessionActivationListener 活化與鈍化

https://blog.csdn.net/qq_26525215/article/details/52262566

要實現會話的持久化,也就是實現HttpSessionActivationListener介面。

實現此介面的JavaBean,可以感知自己被活化(從硬碟到記憶體)和鈍化(從記憶體到硬碟)的過程。

如果需要同時儲存Session中的JavaBean。
則JavaBean也要實現Serializable序列化介面。

實現此介面的JavaBean與HttpSessionBindingListener一樣,不必配置到web.xml中。必須配置到Tomcat伺服器中!

其實就是在使用者訪問的時候,假如伺服器突然關閉了,這個時候,使用者的session就不存在了,假如是購物網站,也就相當於,使用者好不容易選好的物品,剛剛新增到購物車,結果,因為伺服器的突然關閉一下,什麼都沒了,這樣很不好,於是我們就需要實現會話的持久化。

可以讓我們在重新啟動伺服器之後使用者的session還在伺服器中存在!
即使用者session的東西還全部在。
因為我們伺服器在關閉的時候把使用者的session儲存到硬碟了(鈍化),在重新啟動伺服器之後,我們又從硬碟中恢復到記憶體中!(注意,只要使用者還沒關閉瀏覽器,那個session會一直存在使用者的客戶端的)
然後啟動後,使用者的資訊就不會丟失!

要實現此功能,必須要先配置以下資訊:
第一步:書寫一個JavaBean,並實現HttpSessionActivationListener介面如下:

package cn.hncu.domain;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

public class Person implements Serializable, HttpSessionActivationListener {
    private String name;

    public Person(String name) {
        super();
        this.name = name;
    }

    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println(this + "儲存到硬碟了...");
    }

    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println(this + "從硬碟讀取並活化了...");
    }

    @Override
    public String toString() {
        return "Perosn [name=" + name + "]---"+super.toString();
    }

}

第二步:JSP頁面,判斷是否存在Person,如果沒有將Person放到Session中:(這一步只是為了演示出效果而加的,實際中不用)

 

<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" import="java.util.*, cn.hncu.domain.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>

  <body>
    <h2>演示session鈍化與活化技術</h2>

    <%
       if(session.getAttribute("p")==null){
           Person p = new Person(""+ (new Random()).nextInt(100) );
           session.setAttribute("p", p);
       }
       System.out.println(session.getId()+"---"+ session.getAttribute("p") );
       Date d = new Date( session.getCreationTime() );
       System.out.println( new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d) );
    %>
  </body>
</html>

第三步:配置Tomcat的Server.xml檔案或是將配置好的xml釋出檔案放到CATALIINA_HOME\conf\Catalina\localhost目錄下:

一個小知識點:
此xml名字可以隨便取,訪問的時候是通過該xml的名字去訪問的,不要用專案名了。
例如取名為aa.xml,則訪問地址為:http://localhost:8080/aa/

假如取名為aa.xml然後用專案名http://localhost:8080/sessionActivationWeb/去訪問了,會出現session鈍化的時候,無法在e:/a目錄下找到。但是活化沒有受影響!!!

通過http://localhost:8080/aa/ 去訪問就可以在e:/a目錄下找到

建議,將xml名字取為:x專案名.xml,這樣就可以直接通過http://localhost:8080/專案名 訪問,這樣session也可以儲存到指定路徑了!

<Context path="/sessionActivationWeb"    docBase="E:/MyEclipse10_workspace/sessionActivationWeb/WebRoot">
<Manager className="org.apache.catalina.session.PersistentManager"
  saveOnRestart="true">
  <Store className="org.apache.catalina.session.FileStore"
         directory="e:/a"> </Store>
</Manager>
</Context>

 

directory=”e:/a”
配置的是在伺服器關閉後,記憶體中session儲存的路徑。
指Session檔案儲存的目錄。

Context path=”/sessionActivationWeb”
sessionActivationWeb是專案名稱!

docBase=”E:/MyEclipse10_workspace/sessionActivationWeb/WebRoot”

E:/MyEclipse10_workspace/sessionActivationWeb/WebRoot
為專案下的WebRoot路徑
第四步:測試

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只做為監聽類,監聽自己是否鈍化或是活化。

使用shutdown.bat關閉tomcat應用:

使用shutdown.bat關閉tomcat應用: