Session 的钝化与活化
(一)鈍化
當(dāng)服務(wù)器正常關(guān)閉時,還存活著的session(在設(shè)置時間內(nèi)沒有銷毀) 會隨著服務(wù)器的關(guān)閉被以文件(“SESSIONS.ser”)的形式存儲在tomcat 的work 目錄下,這個過程叫做Session 的鈍化。
(二)活化
當(dāng)服務(wù)器再次正常開啟時,服務(wù)器會找到之前的“SESSIONS.ser” 文件,從中恢復(fù)之前保存起來的Session 對象,這個過程叫做Session的活化。
(三)注意事項
??????1)想要隨著Session 被鈍化、活化的對象它的類必須實現(xiàn)Serializable 接口,還有要注意的是只有在服務(wù)器正常關(guān)閉的條件下,還未超時的Session 才會被鈍化成文件。當(dāng)Session 超時、調(diào)用invalidate 方法或者服務(wù)器在非正常情況下關(guān)閉時,Session 都不會被鈍化,因此也就不存在活化。
??????2)在被鈍化成“SESSIONS.ser” 文件時,不會因為超過Session 過期時間而消失,這個文件會一直存在,等到下一次服務(wù)器開啟時消失。
??????3)當(dāng)多個Session 被鈍化時,這些被鈍化的Session 都被保存在一個文件中,并不會為每個Session 都建立一個文件。
(四)演示
定義兩個Servlet ,在一個Servlet 中將“username” 保存在Session 中,另一個Servlet 中獲取到該“username”,輸出到瀏覽器。
SessionServlet1
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;@WebServlet("/session1") public class SessionServlet1 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//將username = zhangsan 保存在Session 中request.getSession().setAttribute("username", "zhangsan");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}SessionServlet12
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;@WebServlet("/session2") public class SessionServlet2 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//獲取到username 輸出到瀏覽器String username = (String) request.getSession().getAttribute("username");response.getWriter().write(username);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}①:首先訪問“session1”,將數(shù)據(jù)存儲到Session 域中,接著再訪問“session2”,可以獲取到“username”的值,如下圖
②:在Session 時間還未過期的時間內(nèi),讓服務(wù)器正常關(guān)閉,在Tomcat 中的work 目錄下,會多出一個“SESSIONS.ser” 文件,里面存儲著還未過期的Session 信息,這也就說明Session 被鈍化了,以文件的形式保存在本地磁盤中。
③:當(dāng)服務(wù)器再次啟動時,該配置文件會消失,當(dāng)我們再次訪問“session2”(不再訪問“session1”的前提下),發(fā)現(xiàn)仍然可以獲取到“username”的值,這時Session 就從被鈍化的文件中活化。
④:當(dāng)服務(wù)器非正常情況下關(guān)閉時(超時、調(diào)用invalidate 方法),Session 不會被鈍化,所以在服務(wù)器再次啟動時,去訪問“session2”,會因為沒有獲取到Session 報空指針異常(下面的演示是服務(wù)器非正常情況下關(guān)閉)。
注:由于String 類本身已經(jīng)實現(xiàn)了序列化接口“java.io.Serializable”,因此會被鈍化成文件。如果我們想要自己定義的“POJO”類也可以鈍化與活化,那么也必須要實現(xiàn)“java.io.Serializable”接口。這也是為什么我們建議將“POJO”類都實現(xiàn)序列化接口的一個原因。
總結(jié)
以上是生活随笔為你收集整理的Session 的钝化与活化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Servlet 编程基础
- 下一篇: Servlet 监听器