一、session知識回顧
1.1 session何時創建?
默認第一次訪問時,使用到了HttpSession就會創建(request.getSession),訪問JSP時由于會自備九大內置物件,因此也會創建session
1.2 session何時銷毀?
1):當session存活時間到期時銷毀(默認30分鐘)
可以在web.xml中配置,延長session的存活時間:
<session-config>
<!-- 單位:分鐘 -->
<session-timeout>30</session-timeout>
</session-config>
2):呼叫session的invalidate()方法時銷毀
3):呼叫session.setMaxInactiveInterval()方法時間到期時銷毀(此方法單位為分鐘)
4):服務器關閉,session銷毀
二、session如何持久化?
2.1 概念
使用session的鈍化與活化可以使session進行磁盤的持久化
鈍化后可以保存到磁盤,檔案名為:sessionid.session,下次客戶端訪問原來的會話(服務器關閉之前的)只要帶上原來的sessionid即可把上一次的會話找回來(活化)

session鈍化后,如果遇到session.invalidate(),session.setMaxInactiveInterval()時間到期,鈍化的檔案會自動洗掉,
2.2 代碼實作session持久化
1)創建一個web專案
- 依賴:
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-api</artifactId>
<version>8.5.41</version>
</dependency>
2)在web專案中添加如下配置:

<Context>
<!-- maxIdleSwap:session中的物件多長時間不使用就鈍化(單位為分鐘) -->
<!-- directory:鈍化后的物件的檔案寫到磁盤的哪個目錄下 配置鈍化的物件檔案在work/catalina/localhost/鈍化檔案 -->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="d:/aaa" />
</Manager>
</Context>
3)撰寫鈍化類
要使session存盤的物件能鈍化和活化必須實作HttpSessionAcivationListener介面,要能將物件存盤到硬碟上必須實作Serializable介面
package com.lscl.entity;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;
/**
* 要使session存盤的物件能鈍化和活化必須實作HttpSessionAcivationListener介面
* 要能將物件存盤到硬碟上必須實作Serializable介面
*/
public class Person implements HttpSessionActivationListener, Serializable {
private String id;
private String name;
public Person() {
}
public Person(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//鈍化時執行的方法
public void sessionWillPassivate(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("Person鈍化了");
}
//活化時執行的方法
public void sessionDidActivate(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("Person活化了");
}
@Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
- 創建session:
package com.lscl.servlet;
import com.lscl.entity.Person;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/create")
public class CreateServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("create訪問成功..."+req.getSession().getId());
Person person=new Person("1","張三");
// 將物件存入session
req.getSession().setAttribute("person",person);
}
}
- 查詢session:
package com.lscl.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/query")
public class QueryServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("query訪問成功..."+req.getSession().getId());
System.out.println(req.getSession().getAttribute("person"));
}
}
- 洗掉session:
package com.lscl.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/delete")
public class DeleteServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("delete訪問成功..."+req.getSession().getId());
// 銷毀session(鈍化的檔案也會被洗掉)
req.getSession().invalidate();
}
}
2.3 測驗session的持久化
1)訪問地址:http://localhost:8080/create創建session,并等1分鐘(等待session鈍化)

查看session檔案:

2)重新啟動服務器(session銷毀),訪問http://localhost:8080/query,查看控制臺資訊

發現服務器重啟之后(session銷毀),會話中的資料依舊能夠找回來;
- 這里說一點,服務器重啟后,是session銷毀了,并不是cookie(sessionid)銷毀了,cookie依舊保存在前端瀏覽器,只要cookie沒有銷毀,前端依舊帶的是上傳的會話id來到后臺
我們換個瀏覽器,訪問http://localhost:8080/query,發現sessionid又是新的了,此時服務器又會創建一個新的session

3)訪問http://localhost:8080/delete,發現session檔案被洗掉了
三、總結一下
-
session的持久化:session的持久化分為鈍化與活化,將session中的內容持久化到磁盤稱為鈍化,鈍化后的session會永久保存在磁盤中,當session銷毀時,.session檔案也會被洗掉
-
被持久化的物件必須實作
HttpSessionAcivationListener和Serializable介面 -
我們平時關閉瀏覽器之后,session的會話資訊查詢不到了并不是session銷毀了,而是前端的cookie銷毀了,此cookie上保存了上次會話的id,訪問后臺時,會自動帶上,如果后臺發現沒有帶上sessionid則創建一個新的session,并將此session的id寫回前端,前端保存到cookie上;至于session何時銷毀,文章開篇已經說了
記得點贊
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/135273.html
標籤:其他
