goweb-會話控制

来源:https://www.cnblogs.com/ygjzs/archive/2020/01/12/12183462.html
-Advertisement-
Play Games

會話控制 HTTP 是無狀態協議,伺服器不能記錄瀏覽器的訪問狀態,也就是說伺服器不 能區分中兩次請求是否由一個客戶端發出。這樣的設計嚴重阻礙的 Web 程式的設計。 如:在我們進行網購時,買了一條褲子,又買了一個手機。由於 http 協議是無狀態的, 如果不通過其他手段,伺服器是不能知道用戶到底買了 ...


會話控制

HTTP 是無狀態協議,伺服器不能記錄瀏覽器的訪問狀態,也就是說伺服器不
能區分中兩次請求是否由一個客戶端發出。這樣的設計嚴重阻礙的 Web 程式的設計。
如:在我們進行網購時,買了一條褲子,又買了一個手機。由於 http 協議是無狀態的,
如果不通過其他手段,伺服器是不能知道用戶到底買了什麼。而 Cookie 就是解決方案
之一。

簡介

Cookie 實際上就是伺服器保存在瀏覽器上的一段信息。瀏覽器有了 Cookie 之後,
每次向伺服器發送請求時都會同時將該信息發送給伺服器,伺服器收到請求後,就可以
根據該信息處理請求。

  1. 第一次向伺服器發送請求時在伺服器端創建 Cookie
  2. 將在伺服器端創建的 Cookie 以響應頭的方式發送給瀏覽器
  3. 以後再發送請求瀏覽器就會攜帶著該 Cookie
  4. 伺服器得到 Cookie 之後根據 Cookie 的信息來區分不同的用戶
  1. 在伺服器創建 Cookie 並將它發送給瀏覽器
    伺服器端代碼
func handler(w http.ResponseWriter, r *http.Request) {
cookie1 := http.Cookie{
Name: "user1",
Value: "admin",
HttpOnly: true,
}
cookie2 := http.Cookie{
Name: "user2",
Value: "superAdmin",
HttpOnly: true,
}
//將 Cookie 發送給瀏覽器,即添加第一個 Cookie
w.Header().Set("Set-Cookie", cookie1.String())
//再添加一個 Cookie
w.Header().Add("Set-Cookie", cookie2.String())
}

瀏覽器響應報文中的內容

HTTP/1.1 200 OK
Set-Cookie: user1=admin; HttpOnly
Set-Cookie: user2=superAdmin; HttpOnly
Date: Sun, 12 Aug 2018 07:24:49 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8
  1. 以後每次發送請求瀏覽器都會攜帶著 Cookie
GET /cookie HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62
Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/
apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: user1=admin; user2=superAdmin
  1. 除了 Set 和 Add 方法之外,Go 還提供了一種更快捷的設置 Cookie 的方式,
    就是通過 net/http 庫中的 SetCookie 方法

將 1)中的代碼進行修改

func handler(w http.ResponseWriter, r *http.Request) {
cookie1 := http.Cookie{
Name: "user1",
Value: "admin",
HttpOnly: true,
}
cookie2 := http.Cookie{
Name: "user2",
Value: "superAdmin",
HttpOnly: true,
}
http.SetCookie(w, &cookie1)
http.SetCookie(w, &cookie2)
}

由於我們在發送請求時 Cookie 在請求頭中,所以我們可以通過 Request 結構中的
Header 欄位來獲取 Cookie

  1. 處理器端代碼
func handler(w http.ResponseWriter, r *http.Request) {
//獲取請求頭中的 Cookie
cookies := r.Header["Cookie"]
fmt.Fprintln(w, cookies)
}
  1. 瀏覽器中的結果

[user1=admin; user2=superAdmin]

Cookie 預設是會話級別的,當關閉瀏覽器之後 Cookie 將失效,我們可以通過 Cookie
結構的 MaxAge 欄位設置 Cookie 的有效時間

  1. 處理器端代碼
func handler(w http.ResponseWriter, r *http.Request) {
cookie := http.Cookie{
Name: "user",
Value: "persistAdmin",
HttpOnly: true,
MaxAge: 60,
}
//將 Cookie 發送給瀏覽器
w.Header().Set("Set-Cookie", cookie.String())
}
  1. 瀏覽器響應報文中的內容
HTTP/1.1 200 OK
Set-Cookie: user=persistAdmin; Max-Age=60; HttpOnly
Date: Sun, 12 Aug 2018 07:32:57 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8
  1. 廣告推薦
  2. 免登錄

Session

簡介

使用 Cookie 有一個非常大的局限,就是如果 Cookie 很多,則無形的增加了客戶
端與服務端的數據傳輸量。而且由於瀏覽器對 Cookie 數量的限制,註定我們不能再
Cookie 中保存過多的信息,於是 Session 出現。

Session 的作用就是在伺服器端保存一些用戶的數據,然後傳遞給用戶一個特殊
的 Cookie,這個 Cookie 對應著這個伺服器中的一個 Session,通過它就可以獲取到保
存用戶信息的 Session,進而就知道是那個用戶再發送請求。

Session 的運行原理

  1. 第一次向伺服器發送請求時創建 Session,給它設置一個全球唯一的 ID(可以通過
    UUID 生成)
  2. 創建一個 Cookie,將 Cookie 的 Value 設置為 Session 的 ID 值,並將 Cookie 發送
    給瀏覽器
  3. 以後再發送請求瀏覽器就會攜帶著該 Cookie
  4. 伺服器獲取 Cookie 並根據它的 Value 值找到伺服器中對應的 Session,也就知道了
    請求是那個用戶發的

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

-Advertisement-
Play Games
更多相關文章
  • IYUU自動輔種工具,目前能對國內大部分的PT站點自動輔種PT種子、BT種子;同時,附帶的下載模塊可訂閱各站免費種。支持下載器集群,支持多盤位,支持多下載目錄,支持遠程連接等。 1.群暉、威聯通不裝軟體,添加免費種子到transmission、qBittorrent,支持微信通知、郵件通知,支持自定... ...
  • 樹莓派智能小車,實現功能:基於超聲波和紅外的自動避障、樹莓派端向PC端的實時圖像傳輸、基於視覺的車道線循跡、基於Tensorflow Object Detection的目標檢測、基於視覺的網球追蹤。 ...
  • # 8.4.1 在函數中修改列表def greet_user(names): '''向列表中的每位用戶都發出簡單的問候''' for name in names: msg = "Hello, " + name.title() + "!" print(msg) usernames = ['star', ...
  • 本片博客主要是搭建一個簡單的SSM框架,感興趣的同學可以看一下 搭建ssm框架首先我們需要有一個資料庫,本篇文章博主將使用一個MySQL的數據,如果沒學過MySQL資料庫的,學過其他資料庫也是可以的 spring: ...
  • "SDOI2016 排列計數" 發現很多題解都沒有講清楚這道題為什麼要用逆元、遞推公式怎麼來的。 ~~我,風雨兼程三十載,只為寫出一篇好題解。~~ 還是我來造福大家一下吧。 題目大意: 一個長度為 n 且 1~n 各出現一次的序列,希望在“序列中有且只有 m個數的值 等於 它的位置”條件下求出序列個 ...
  • 開發環境: Windows操作系統開發工具: Eclipse+Jdk+Tomcat+MYSQL資料庫運行效果圖: 源碼及原文鏈接:http://javadao.xyz/forum.php?mod=viewthread&tid=26 ...
  • 給定一個按照升序排列的長度為n的整數數組,以及 q 個查詢。 對於每個查詢,返回一個元素k的起始位置和終止位置(位置從0開始計數)。 如果數組中不存在該元素,則返回“-1 -1”。 輸入格式 第一行包含整數n和q,表示數組長度和詢問個數。 第二行包含n個整數(均在1~10000範圍內),表示完整數組 ...
  • MyBatis的緩存指的是緩存查詢結果,當以後使用相同的sql語句、傳入相同的參數進行查詢時,可直接從mybatis本地緩存中獲取查詢結果,而不必查詢資料庫。 mybatis的緩存包括一級緩存、二級緩存,一級緩存預設是開啟的,二級緩存預設是關閉的。 一級緩存: SqlSession級別,在SqlSe ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...