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應用: