一文快速回顧 Session 和 Cookie

来源:https://www.cnblogs.com/god23bin/archive/2023/03/11/a_quick_review_of_the_article_about_session_and_cookie.html
-Advertisement-
Play Games

在 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

image-20230228235001252

Cookie 和 Session 總是會被拿來比較的。Cookie 和 Session 都是用來跟蹤瀏覽器用戶身份的會話技術,或者說一種機制。它們都可以實現在多個頁面之間共用用戶的狀態。

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 只能在同一功能變數名稱下共用。

最後的最後

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

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

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ​ 表格: <table> <tr> <th>表格1</th> </tr> <tr> <td>表格2</td> </tr> </table> 快捷鍵:table>tr*數量>td*數量 屬性名 屬性值 說明 align left、center、right border 1或“” 邊框 cellpad ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 vue3 於 2020 年 09 月 18 日正式發佈,2022 年 2 月 7 日 vue3 成為新的預設版本 距離 vue3 正式發佈已經過去兩年有餘, 成為預設版本也過去大半年了,以前還能說是對新技術、新特性的觀望,而現在面試都直問 ...
  • Web開發工具 從高層次來看,可以將客戶端工具放入以下三大類需要解決的問題中: 安全網路 — 在代碼開發期間有用的工具。 轉換 — 以某種方式轉換代碼的工具,例如將一種中間語言轉換為瀏覽器可以理解的 JavaScript。 開發後階段 — 編寫完代碼後有用的工具,如測試和部署工具。 終端命令 導航計 ...
  • 大數據時代,各行各業對數據採集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實現從易到難全方位覆蓋,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為網頁基本結構介紹。 網頁概述 網頁是互聯網應用的一種形態,是組 ...
  • 前言: Antd + echarts 我想要實現的是點擊表的某一行自動生成對應的折線圖,我在點擊第一行生成5條線,我在點擊第二行的時候,本該生成2條線,結果還是5條線; 最開始我以為設置的 series 沒有初始化,後來打斷點查看數據是兩條,但是生成的線是五條,這個就很離譜 問題原因 官網是這麼說的 ...
  • 裝飾者模式(Decorator Pattern)是一種結構型設計模式,它允許你在不改變對象自身的基礎上,動態地給一個對象添加額外的功能。在前端中,裝飾者模式經常被用於擴展或修改組件的行為或樣式。 JavaScript 中的裝飾者模式可以通過以下幾種方式實現: 1. 通過擴展對象的屬性或方法來實現裝飾 ...
  • 本文是系列第五篇,終章。系列文章: 現代圖片性能優化及體驗優化指南 - 圖片類型及 Picture 標簽的使用 現代圖片性能優化及體驗優化指南 - 響應式圖片方案 現代圖片性能優化及體驗優化指南 - 縮放精細化展示及避免佈局偏移、拉伸 現代圖片性能優化及體驗優化指南 - 懶載入及非同步圖像解碼方案 圖 ...
  • 客觀的理解DDD DDD,即領域驅動設計,不僅帶給我們一套新的概念,還提供了一套全新的設計思路,應用在構建大型複雜軟體系統之上。 相對於DDD,我們使用的傳統的設計思路,常被稱為數據驅動設計,常被應用於中小型的項目。互聯網的項目,往往是快速迭代,起初一個小項目,慢慢會演化為一個中大型的項目,在演化過 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...