在 Web 應用程式中(通俗點,可以理解成一個網站),Session 和 Cookie 是兩個非常重要的概念,主要用於實現用戶身份認證、數據傳遞等功能。今天就來講講這兩個東西。 ...
前言
在 Web 應用程式中(通俗點,可以理解成一個網站),Session 和 Cookie 是兩個非常重要的概念,主要用於實現用戶身份認證、數據傳遞等功能。今天就來講講這兩個東西。
對於當時剛開始接觸到這兩個概念的我來說,這兩個東西是非常模糊的,當然,這樣也和我自己 Java 基礎不牢固有關,導致在學習 Java Web 的過程中,埋下了許多地雷。現如今,從新梳理下,希望能給屏幕前的你帶來收穫。
本篇文章目標人群是學了後忘了的,學了後想要鞏固的。當然,還沒學,那就更好啦,直接看這一篇就夠了!
Session 的概念
Session 是 Web 應用程式中的一種會話管理機制,用於存儲和維護用戶的會話狀態。
那問題來了,什麼是「會話」?
會話是指在用戶與伺服器之間的一系列請求和響應之間的交互過程。
當用戶訪問 Web 應用時,伺服器會創建一個唯一的會話 ID,並將其存儲在用戶的瀏覽器中的 Cookie 中。在接下來的請求中,瀏覽器會將會話 ID 作為參數發送給伺服器,以便伺服器可以識別用戶並將其請求與之前的請求相關聯。
為什麼會有 Session?
由於 HTTP 協議是無狀態的,當用戶在網站中進行多次請求,伺服器並不能判斷這些請求是不是來自同一用戶,所以出現了一種技術,這種技術稱為「會話跟蹤技術」。
會話跟蹤技術就能解決這個問題。與無狀態的通信相比,會話是一種有狀態的通信,這種通信至少需要一方來維護當前的狀態信息和歷史信息。
而 Session 就是其中一種會話跟蹤技術,當然,後面說的 Cookie 也是。
,並將 Session ID 存儲在 Cookie 中或者 URL 參數中。
Session 的原理
Session 的原理是基於伺服器端的存儲和管理,因此相對來說比較安全。在用戶訪問 Web 應用程式時,伺服器會為每個用戶創建一個唯一的 Session ID,伺服器會將 Session ID 和對應的會話狀態存儲在記憶體或者資料庫中,同時也返回一份 Session ID 給瀏覽器,讓瀏覽器存儲在 Cookie 中,併在一定時間內保持有效。當用戶進行後續的請求時,伺服器會根據 Session ID 來識別用戶,並獲取和維護用戶的會話狀態。最後,當用戶關閉瀏覽器或者超過一定時間沒有活動時,伺服器會自動銷毀對應的 Session。
Session 的優點是安全性相對較高,存儲容量可以存儲任意數據類型,並且可以設置失效時間。但是它也存在一些缺點:
- 存儲在伺服器端,需要占用伺服器資源(比如記憶體資源)
- 失效時間短,一般只有數分鐘或數小時
- 難以跨域共用,不同功能變數名稱的伺服器無法共用 Session
代碼如何寫?
那伺服器這邊是怎樣去存儲和管理的呢?代碼是怎樣寫的呢?
在 Java Web 中,可以使用 Servlet API 中封裝好的 Session 對象(HttpSession)來進行操作。
在Servlet API中,HttpSession 由 Servlet容器(比如 Tomcat)創建,它可以存儲任意的 Java 對象,我們可以通過 setAttribute()
方法將對象綁定到 Session 中,之後通過 getAttribute()
方法獲取綁定在 Session 中的對象。
也就是說,可以在一次會話的多次請求間共用數據,將數據保存在伺服器端的對象中。
- 獲取 Session 對象
我們可以通過 HttpServletRequest 的 getSession() 方法來獲取 HttpSession 對象。如果 HttpSession 對象不存在,則會創建一個新的 Session 對象。
Session 常用方法
以下是一些常用的 Session 對象的方法:
-
setAttribute(String name, Object value)
:將一個名為 name,值為 value 的對象綁定到 Session 中。 -
getAttribute(String name)
:獲取 Session 中綁定的名為 name 的對象。 -
removeAttribute(String name)
:從 Session 中刪除名為 name 的對象。 -
getId()
:獲取 Session 的唯一標識符。 -
getCreationTime()
:獲取 Session 的創建時間。 -
getLastAccessedTime()
:獲取 Session 的最後訪問時間。 -
setMaxInactiveInterval(int interval)
:設置 Session 的最大不活動時間間隔,單位為秒。 -
getMaxInactiveInterval()
:獲取 Session 的最大不活動時間間隔。
示例代碼:
SessionServlet
:
@WebServlet(name = "SessionServlet", urlPatterns = "/session")
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取 Session 對象
HttpSession session = req.getSession();
// 將用戶名存儲到 Session 中
session.setAttribute("username", req.getParameter("username"));
// 重定向到另一個頁面
resp.sendRedirect("anotherPage.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
這裡使用了 @WebServlet
來配置這個 Servlet,處理的請求映射的路徑為 /session
,主要進行了 Session 對象的相關操作,存儲了用戶信息,重定向到另一個頁面,通過 Session,此時在另一個頁面,就能夠獲取到存儲的信息。
anotherPage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>
<html>
<head>
<title>這裡是有Session的</title>
</head>
<body>
<%
String username = (String) session.getAttribute("username");
%>
<h2>從Session中獲取的信息:<%=username%></h2>
</body>
</html>
生成唯一 ID 返回給瀏覽器
@WebServlet(name = "SessionIdServlet", urlPatterns = "/sessionId")
public class SessionIdServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
// 獲取 SessionID
String sessionId = session.getId();
// 創建名為JSESSIONID的 Cookie
Cookie cookie = new Cookie("JSESSIONID", sessionId);
// 設置 Cookie 效時間為30分鐘
cookie.setMaxAge(30 * 60);
// 將 Cookie 追加到響應中返回給瀏覽器
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
通過瀏覽器向這個路徑 /sessionId
發起請求,就會接收到伺服器返回的響應,這裡的響應就有我們進行處理的名為 JSESSIONID 的 Cookie
Cookie 的概念
Cookie 和 Session 總是會被拿來比較的。Cookie 和 Session 都是用來跟蹤瀏覽器用戶身份的會話技術,或者說一種機制。它們都可以實現在多個頁面之間共用用戶的狀態。
Cookie 的原理
Cookie 是一種在客戶端(瀏覽器)保存數據的機制。
瀏覽器第一次發送請求到伺服器,伺服器就創建 Cookie(上面的代碼中我們寫了),該 Cookie 中包含著信息,可以是用戶的信息(用戶偏好設置、廣告偏好),然將該 Cookie 發送到瀏覽器。
瀏覽器之後再次訪問伺服器時就會攜帶伺服器創建的 Cookie,這不需要我們做任何操作,不需要寫任何代碼,瀏覽器幫我們實現了在每一次的請求中都攜帶上 Cookie。伺服器端通過 Cookie 中攜帶的數據區分不同的用戶。
Cookie 的優點是可以長時間保存,並且可以在客戶端設置,但是它也存在一些缺點:
- 安全性相對較差,容易被不法分子獲取
- 存儲容量有限,一般只能存儲 ASCII 碼
- 失效時間可以設置,但是客戶端可以隨時清除 Cookie
總結
Session 是一種伺服器端的存儲機制,它將用戶狀態信息存儲在伺服器上,每個用戶都有一個獨立的 Session。
在用戶第一次訪問伺服器的時候,伺服器會為其創建一個 Session,並將 Session ID 放到一個名為 JSESSIONID 的 Cookie 中發送給瀏覽器。
Cookie 是一種客戶端(瀏覽器)存儲機制,它將用戶狀態信息存儲在客戶端瀏覽器上。我們知道,用戶第一次訪問伺服器的時候,伺服器會將一些數據(比如 JSESSIONID)寫入 Cookie 併發送給客戶端,客戶端在後續的請求中會將 Cookie 發送給伺服器。
在存儲容量方面,Cookie 的存儲容量較小,一般只能存儲 ASCII 碼,而 Session 可以存儲任意數據類型。在安全性方面,Session 相對於 Cookie 更加安全,因為 Session 存儲在伺服器,客戶端無法直接訪問。在跨域共用方面,Cookie 可以跨域共用,而 Session 只能在同一功能變數名稱下共用。
最後的最後
由本人水平所限,難免有錯誤以及不足之處, 屏幕前的靚仔靚女們
如有發現,懇請指出!
最後,謝謝你看到這裡,謝謝你認真對待我的努力,希望這篇博客對你有所幫助!
你輕輕地點了個贊,那將在我的心裡世界增添一顆明亮而耀眼的星!