HttpSessionActivationListener 監聽HttpSession對象的活化、鈍化 鈍化:將HttpSession對象從記憶體中轉移至硬碟,存儲為.session文件。 活化:把HttpSession對象從持久化狀態轉變為運行狀態(從硬碟載入到記憶體,恢複原樣)。 HttpSessi ...
HttpSessionActivationListener 監聽HttpSession對象的活化、鈍化
鈍化:將HttpSession對象從記憶體中轉移至硬碟,存儲為.session文件。
活化:把HttpSession對象從持久化狀態轉變為運行狀態(從硬碟載入到記憶體,恢複原樣)。
@WebListener()
public class MyListener implements HttpSessionActivationListener , Serializable {
public void sessionWillPassivate(HttpSessionEvent se) {
//鈍化時調用
//.....
}
public void sessionDidActivate(HttpSessionEvent se) {
//活化時調用
//......
}
}
session.setAttribute("myListener",new MyListener());
session.setAttribute("name","chy");
HttpSessionActivationListener和HttpSessionBindListener一樣,需要放到某個session中才能監聽,監聽的是某個具體的session。
鈍化是一種特殊的序列化,活化是一種特殊的反序列化,特殊在作用範圍限定為session。
既然鈍化是一種特殊的序列化,那就是說session中只有可序列化的對象才會被鈍化。java自帶的數據類型大多數都已implements Serializable,是可序列化的。我們自己寫的實體類,需要實現Serializable介面或Externalizable介面才會被鈍化。
HttpSessionActivationListener對象要放到session中,也是session中的對象,
- 如果我們寫的類在實現HttpSessionActivationListener的同時,還實現了Serializable介面或Externalizable介面,鈍化時這個監聽器可以監聽到鈍化事件,調用對應的方法,活化時可以監聽到活化事件,調用對應的方法。
- 如果我們寫的類在實現HttpSessionActivationListener的同時,沒有實現Serializable介面或Externalizable介面,則鈍化時這個監聽器可以監聽到鈍化事件,調用對應的方法,但活化時不能監聽到活化事件,對應的方法不起作用。
Session鈍化的配置
HttpSessionActivationListener這個監聽器需要配合鈍化配置使用。有2種方式可以配置鈍化:
- 在tomcat -> conf -> context.xml 的<Context>中配置
- 在web下新建META-INF目錄,接著在META-INF下新建context.xml:
<?xml version="1.0" ?> <Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="2"> <Store className="org.apache.catalina.session.FileStore" directory="d:/session"> </Store> </Manager> </Context>
也是在<Context>中配置。
maxIdleSwap指定session在空閑多少分鐘後(在多少分鐘內沒有再次使用此session),會被鈍化到硬碟的.session文件中。
directory指定.session文件的位置,指定的目錄不存在時會自動創建。
在tomcat中配置的是全局的,對tomcat下所有部署的WebApp都有效。
在項目中配置的,只作用於這個項目。
Eclipse會自動創建META-INF目錄,但IDEA不會自動創建,需要我們需要手動在web下創建META-INF,META-INF和WEB-INF同一級別。
Session鈍化配置,監管的是所有的session對象,哪個session在指定時間內沒被使用,就鈍化這個session到硬碟,一個session一個.session文件。
當一個session對象鈍化到.session文件後,之後再次鈍化時,還是鈍化到同一個.session文件中(先刪除原有內容,再寫入)。
HttpSessionActivationListener監聽的是某個具體的session,只監聽所在session的鈍化、活化。
監聽器只起到監聽作用,並不能實現鈍化,監聽器只是監聽這一行為,並做出相應的處理。
session超時,是會刪除該session對象,此session中的數據全部丟失;
session鈍化是將此session暫存到硬碟,需要時載入到記憶體接著用,數據依然在。
某個jsp中,先request.getSession()獲取session,然後使用Session中的數據。我一直停留在這個jsp頁面,算不算一直在使用這個session?
不算。jsp和php一樣,是在伺服器端解析的。tomcat解析jsp(此時使用session),然後以html文檔的形式返回給瀏覽器,瀏覽器顯示的是html文檔,html是靜態資源,和session沒有半毛錢關係。
session鈍化對高併發項目很有用。
比如雙11、雙12,大家都先打開購物車,不做其他操作,坐等時間一到就購買。
伺服器記憶體中有大量的Session對象,但很多session在幾分鐘內都是閑置的。通過session鈍化將這些閑置的session暫存到硬碟,減輕伺服器負擔,等到需要時會自動活化。