動態

詳情 返回 返回

一文快速回顧 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

image-20230228235001252

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 只能在同一域名下共享。

最後的最後

由本人水平所限,難免有錯誤以及不足之處, 屏幕前的靚仔靚女們 如有發現,懇請指出!

最後,謝謝你看到這裏,謝謝你認真對待我的努力,希望這篇博客對你有所幫助!

你輕輕地點了個贊,那將在我的心裏世界增添一顆明亮而耀眼的星!

user avatar mannayang 頭像 vanve 頭像 xiaoniuhululu 頭像 tech 頭像 u_16769727 頭像 kohler21 頭像 daqianduan 頭像 lvlaotou 頭像 yizhidanshendetielian 頭像 wnhyang 頭像 boxuegu 頭像 chaochenyinshi 頭像
點贊 47 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.