欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于Gin框架中的Cookie和Session的使用方法

 更新時(shí)間:2024年10月25日 10:02:49   作者:景天科技苑  
為了實(shí)現(xiàn)跨請(qǐng)求的數(shù)據(jù)共享,我們可以使用Cookie和Session,本文將結(jié)合實(shí)際案例,詳細(xì)介紹在Go語(yǔ)言的Gin框架中如何使用Cookie和Session,并通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下

引言

在深入探討Cookie和Session之前,我們需要了解HTTP協(xié)議的無(wú)狀態(tài)特性。簡(jiǎn)單來(lái)說(shuō),HTTP是一種無(wú)狀態(tài)協(xié)議,即每次請(qǐng)求與響應(yīng)之間都是獨(dú)立的,服務(wù)器不會(huì)記住之前的狀態(tài)信息。這意味著,當(dāng)用戶從一個(gè)頁(yè)面跳轉(zhuǎn)到另一個(gè)頁(yè)面時(shí),服務(wù)器無(wú)法自動(dòng)識(shí)別這是同一個(gè)用戶的請(qǐng)求。為了實(shí)現(xiàn)跨請(qǐng)求的數(shù)據(jù)共享,我們可以使用Cookie和Session。本文將結(jié)合實(shí)際案例,詳細(xì)介紹在Go語(yǔ)言的Gin框架中如何使用Cookie和Session。

一、Cookie的詳細(xì)用法

1. Cookie的基本概念

Cookie是一種存儲(chǔ)在客戶端瀏覽器中的鍵值對(duì)數(shù)據(jù),用于在客戶端和服務(wù)器之間傳遞信息。每次向服務(wù)器發(fā)送請(qǐng)求時(shí),瀏覽器都會(huì)自動(dòng)攜帶這些Cookie信息。

2. 設(shè)置Cookie

在Gin框架中,可以通過(guò)c.SetCookie方法設(shè)置Cookie。以下是該方法的主要參數(shù):

  • name:Cookie的名稱(chēng)。
  • value:Cookie的值。
  • maxAge:Cookie的過(guò)期時(shí)間(秒)。如果只想設(shè)置Cookie的保存路徑而不想設(shè)置存活時(shí)間,可以在此參數(shù)中傳遞nil。
  • path:Cookie的路徑。
  • domain:Cookie的域名作用域。本地調(diào)試時(shí)配置為localhost,正式上線時(shí)配置為域名。
  • secure:當(dāng)此值為true時(shí),Cookie在HTTP中是無(wú)效的,僅在HTTPS中有效。
  • httpOnly:如果設(shè)置了此屬性,則通過(guò)程序(如JS腳本)將無(wú)法讀取到Cookie信息,防止XSS攻擊。

示例代碼:

package main

import (
    "github.com/gin-gonic/gin"
)

func TestHandler(c *gin.Context) {
    // 獲取客戶端是否攜帶Cookie 獲取名為"username"的Cookie
    // 如果不存在將myCookie設(shè)為lucas
    mycookie, err := c.Cookie("username")
    if err != nil {
        mycookie = "lucas"
    }
    // 給客戶端設(shè)置Cookie
    // func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
    c.SetCookie("username", mycookie, 60*60, "/", "localhost", false, true)
    //響應(yīng)客戶端字符串
    c.String(200, "測(cè)試Cookie")
}

func main() {
    r := gin.Default() // 創(chuàng)建路由,默認(rèn)使用Logger()和Recovery()中間件
    // func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes
    r.GET("/cookie", TestHandler)
    r.Run(":8888")
}

可以看到服務(wù)端給瀏覽器客戶端設(shè)置的cookie

在這里插入圖片描述

3. 獲取cookie

要獲取客戶端請(qǐng)求中的Cookie,可以使用c.Cookie()方法。以下是一個(gè)示例:

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func getCookie(c *gin.Context) {
    // 獲取名為"username"的Cookie
    cookie, err := c.Cookie("username")
    if err != nil {
        c.String(http.StatusOK, "未找到Cookie")
        return
    }
    c.String(http.StatusOK, "Cookie值:"+cookie)
}

func main() {
    r := gin.Default()
    r.GET("/getCookie", getCookie)
    r.Run(":8080")
}

由于我們?cè)O(shè)置了一條cookie,username為lucas,所以能獲取到

在這里插入圖片描述

4. 刪除Cookie

刪除Cookie實(shí)際上是通過(guò)設(shè)置其過(guò)期時(shí)間為負(fù)數(shù)來(lái)實(shí)現(xiàn)的。

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func deleteCookie(c *gin.Context) {
    // 刪除名為"username"的Cookie
    //實(shí)際上就是設(shè)置maxAge為負(fù)數(shù)
    c.SetCookie("username", "", -1, "/", "localhost", false, true)
    c.String(http.StatusOK, "刪除Cookie成功")
}

func main() {
    r := gin.Default()
    //在請(qǐng)求處,將handlers函數(shù)傳進(jìn)來(lái)
    r.GET("/deleteCookie", deleteCookie)
    r.Run(":8080")
}

在上面的代碼中,c.SetCookie(“username”, “”, -1, “/”, “localhost”, false, true)方法會(huì)將名為"username"的Cookie過(guò)期時(shí)間設(shè)置為過(guò)去的時(shí)間戳,從而刪除該Cookie。

二、Session的詳細(xì)用法

1. Session的基本概念

Session是一種記錄客戶狀態(tài)的機(jī)制,與Cookie不同的是,Session數(shù)據(jù)保存在服務(wù)器上。當(dāng)客戶端瀏覽器第一次訪問(wèn)服務(wù)器并發(fā)送請(qǐng)求時(shí),服務(wù)器端會(huì)創(chuàng)建一個(gè)Session對(duì)象,生成一個(gè)類(lèi)似于key-value的鍵值對(duì),然后將value保存到服務(wù)器,將key(通常是一個(gè)Cookie)返回到瀏覽器(客戶端)。瀏覽器下次訪問(wèn)時(shí)會(huì)攜帶這個(gè)key,服務(wù)器通過(guò)這個(gè)key找到對(duì)應(yīng)的Session數(shù)據(jù)。

在這里插入圖片描述

2. Session的工作原理

  • 1: 我們的請(qǐng)求在默認(rèn)情況下是無(wú)狀態(tài)的,所謂的無(wú)狀態(tài)就是指,gin定義一個(gè)路由地址,在瀏覽器訪問(wèn)以后,也就是
    發(fā)起一個(gè)request,到response的過(guò)程,整個(gè)過(guò)程結(jié)束后,并不會(huì)在服務(wù)器端存儲(chǔ)數(shù)據(jù)。這樣就會(huì)造成一個(gè)問(wèn)題,
    無(wú)法解決各路由請(qǐng)求之間數(shù)據(jù)的共享問(wèn)題。
  • 2:如何解決這個(gè)問(wèn)題呢?其實(shí)也就是session
  • 3:session是一種服務(wù)器端的存儲(chǔ)技術(shù),其實(shí)在底層就是一個(gè)全局的map[string][any]對(duì)象。它可以把一些需要各個(gè)
    路由間共享的數(shù)據(jù)進(jìn)行存儲(chǔ)在內(nèi)存中,直到服務(wù)器關(guān)閉或者超時(shí)才會(huì)清除。
  • 4:有了session,為什么還有有sessionId呢?因?yàn)橐獏^(qū)分是那個(gè)業(yè)務(wù)的數(shù)據(jù),因?yàn)榈讓邮莔ap,所以大部分情況下都會(huì)
    用sessionId作為key.
  • 5:有了session,為啥還要cookie技術(shù)呢,cookie是一種客戶端的存儲(chǔ)技術(shù),在創(chuàng)建session的時(shí)候,每次都會(huì)把這個(gè)
    sessionId寫(xiě)入到客戶端瀏覽器的cookie中,后續(xù)給未來(lái)的每個(gè)路由請(qǐng)求都攜帶這個(gè)sessionId, 到服務(wù)端的map種去匹配
    對(duì)應(yīng)自己的數(shù)據(jù)信息。
  • 6:從而達(dá)到數(shù)據(jù)的共享。

3. Sesison的應(yīng)用場(chǎng)景

第一次登錄,服務(wù)器給客戶端頒發(fā)一個(gè)唯一的sessionId, 并通過(guò)http的響應(yīng)頭返回。客戶端(瀏覽器)發(fā)現(xiàn)返回的數(shù)據(jù)中有cookie數(shù)據(jù)就把這個(gè)cookie數(shù)據(jù)存放到內(nèi)存。下次再發(fā)送http請(qǐng)求時(shí),把內(nèi)存中的cookie數(shù)據(jù)再塞到http請(qǐng)求頭中,一并發(fā)給服務(wù)器,服務(wù)器在解析請(qǐng)求時(shí),發(fā)現(xiàn)請(qǐng)求頭中有cookie,就開(kāi)始識(shí)別cookie中的sessionId,拿到sessionId,我們就知道這個(gè)請(qǐng)求時(shí)由哪個(gè)客戶端發(fā)送來(lái)的了。

4. 在Gin框架中使用Session

Gin框架本身并不內(nèi)置對(duì)Session的支持,但可以使用第三方的Session中間件來(lái)實(shí)現(xiàn)。其中比較常用的是github.com/gin-contrib/sessions。

1. 安裝依賴

首先,需要安裝Session中間件:

go get github.com/gin-contrib/sessions

在這里插入圖片描述

2. 創(chuàng)建基于內(nèi)存的Session

Session存儲(chǔ)引擎有多種實(shí)現(xiàn)方式,如基于內(nèi)存、Redis、MongoDB等。以下是一個(gè)基于內(nèi)存的示例:

package main

import (
    "github.com/gin-contrib/sessions"
    "github.com/gin-contrib/sessions/memstore"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    // 創(chuàng)建基于內(nèi)存的存儲(chǔ)引擎
    // func NewStore(keyPairs ...[]byte) Store
    store := memstore.NewStore([]byte("secret11111"))
    // 設(shè)置Session中間件
    // func Sessions(name string, store Store) gin.HandlerFunc
    r.Use(sessions.Sessions("mysession", store))

    r.GET("/", func(c *gin.Context) {
        // 初始化Session對(duì)象
        session := sessions.Default(c)
        // 設(shè)置Session數(shù)據(jù)
        session.Set("username", "zhangsan")
        // 保存Session數(shù)據(jù)
        session.Save()
        c.JSON(200, gin.H{"message": "Session設(shè)置成功"})
    })

    r.GET("/get", func(c *gin.Context) {
        // 初始化Session對(duì)象
        session := sessions.Default(c)
        // 獲取Session數(shù)據(jù)
        username := session.Get("username")
        c.JSON(200, gin.H{"username": username})
    })

    r.Run(":8080")
}

在上面的代碼中,memstore.NewStore([]byte(“secret11111”))創(chuàng)建了一個(gè)基于內(nèi)存的Session存儲(chǔ)引擎,sessions.Sessions(“mysession”, store)設(shè)置了Session中間件,其中"mysession"是Session的名稱(chēng),也是Cookie的名稱(chēng)。

當(dāng)我們?cè)L問(wèn)首頁(yè),設(shè)置session成功

在這里插入圖片描述

當(dāng)我們?cè)L問(wèn)/get,可以獲取session

在這里插入圖片描述

在控制器中使用Session
在Gin框架的控制器中,可以使用sessions.Default©方法獲取當(dāng)前的Session對(duì)象,然后調(diào)用Set、Get和Save等方法來(lái)設(shè)置、獲取和保存Session數(shù)據(jù)。

3. 創(chuàng)建基于Redis存儲(chǔ)Session

如果希望將Session數(shù)據(jù)保存在Redis中,可以使用github.com/gin-contrib/sessions/redis包。以下是一個(gè)示例:
首先,安裝Redis存儲(chǔ)引擎的包:

go get -u github.com/gin-contrib/sessions/redis

然后,配置Redis存儲(chǔ)引擎:

package main

import (
    "github.com/gin-contrib/sessions"
    "github.com/gin-contrib/sessions/redis"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    // 創(chuàng)建基于Redis的存儲(chǔ)引擎
    // func NewStore(size int, network, address, password string, keyPairs ...[]byte) (Store, error)
    // func NewStoreWithDB(size int, network, address, password, DB string, keyPairs ...[]byte) (Store, error) 指定DB
    store, _ := redis.NewStoreWithDB(10, "tcp", "10.10.0.100:6379", "123456", "0", []byte("secret"))
    // 設(shè)置Session中間件
    r.Use(sessions.Sessions("mysession", store))

    r.GET("/", func(c *gin.Context) {
        // 初始化Session對(duì)象
        session := sessions.Default(c)
        // 設(shè)置Session數(shù)據(jù)
        session.Set("username", "jingtian")
        // 保存Session數(shù)據(jù)
        session.Save()
        c.JSON(200, gin.H{"message": "Session設(shè)置成功"})
    })

    r.GET("/get", func(c *gin.Context) {
        // 初始化Session對(duì)象
        session := sessions.Default(c)
        // 獲取Session數(shù)據(jù)
        username := session.Get("username")
        c.JSON(200, gin.H{"username": username})
    })

    r.Run(":8080")
}

瀏覽器訪問(wèn)首頁(yè),session保存成功

在這里插入圖片描述

登錄redis查看,可以看到session

在這里插入圖片描述

5. Session的基本操作

在獲取到Session對(duì)象后,我們可以對(duì)其進(jìn)行設(shè)置、獲取、刪除和清除等操作。需要注意的是,每次對(duì)Session進(jìn)行修改后,都需要調(diào)用session.Save()方法來(lái)保存更改。

設(shè)置Session:

session.Set("username", "zhangsan")  
session.Save()

獲取Session:

username := session.Get("username")

刪除Session中的某個(gè)鍵值對(duì):

session.Delete("username")  
session.Save()

清除整個(gè)Session:

session.Clear()  
session.Save()

三、注意事項(xiàng)

  • Cookie的Secure屬性:當(dāng)設(shè)置為true時(shí),Cookie僅在HTTPS中有效。在生產(chǎn)環(huán)境中,為了安全起見(jiàn),建議啟用HTTPS并設(shè)置Secure屬性。
  • Cookie的HttpOnly屬性:設(shè)置為true時(shí),可以防止通過(guò)JS腳本讀取Cookie,增加安全性。
  • Session的過(guò)期時(shí)間:可以通過(guò)設(shè)置Session存儲(chǔ)引擎的Options來(lái)配置過(guò)期時(shí)間等參數(shù)。
  • 跨域問(wèn)題:在涉及跨域請(qǐng)求時(shí),需要確保服務(wù)器正確配置了CORS(跨域資源共享)中間件,并允許攜帶Credentials。
  • Gob編解碼器:Gin框架的Session中間件使用Gob作為編解碼器。當(dāng)存儲(chǔ)復(fù)雜類(lèi)型(如struct、map等)時(shí),需要先注冊(cè)這些類(lèi)型,否則會(huì)報(bào)錯(cuò)“gob: type not registered for…”。

四、總結(jié)

本文詳細(xì)介紹了在Go語(yǔ)言的Gin框架中如何使用Cookie和Session來(lái)實(shí)現(xiàn)跨請(qǐng)求的數(shù)據(jù)共享。通過(guò)合理配置和使用這些機(jī)制,我們可以有效地管理客戶端狀態(tài),提高應(yīng)用程序的可用性和安全性。

以上就是關(guān)于Gin框架中的Cookie和Session的使用方法的詳細(xì)內(nèi)容,更多關(guān)于Gin框架Cookie和Session的使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • gin框架中使用JWT的定義需求及解析

    gin框架中使用JWT的定義需求及解析

    這篇文章主要為介紹了gin框架中使用JWT的定義需求及解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 使用Go語(yǔ)言封裝實(shí)現(xiàn)郵件發(fā)送功能

    使用Go語(yǔ)言封裝實(shí)現(xiàn)郵件發(fā)送功能

    在現(xiàn)代 Web 開(kāi)發(fā)中,郵件發(fā)送功能是一個(gè)常見(jiàn)的需求,本文將介紹如何在 Go 語(yǔ)言中封裝一個(gè)通用的郵件發(fā)送包,支持驗(yàn)證碼發(fā)送和通用郵件發(fā)送,需要的可以參考下
    2025-03-03
  • go語(yǔ)言中strings包的用法匯總

    go語(yǔ)言中strings包的用法匯總

    Golang語(yǔ)言 strings標(biāo)準(zhǔn)庫(kù)包主要涉及字符串的基本操作,下面我們來(lái)詳細(xì)分析下吧
    2018-10-10
  • Go語(yǔ)言基礎(chǔ)函數(shù)基本用法及示例詳解

    Go語(yǔ)言基礎(chǔ)函數(shù)基本用法及示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)函數(shù)基本用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-11-11
  • 一文帶你了解Golang中強(qiáng)大的重試機(jī)制

    一文帶你了解Golang中強(qiáng)大的重試機(jī)制

    在 Go 語(yǔ)言中,處理瞬態(tài)錯(cuò)誤是常見(jiàn)的挑戰(zhàn),這些錯(cuò)誤可能會(huì)在一段時(shí)間后自動(dòng)恢復(fù),因此,重試機(jī)制在這些情況下非常重要,所以本文就來(lái)和大家聊聊Golang中強(qiáng)大的重試機(jī)制吧
    2025-01-01
  • Golang?channel為什么不會(huì)阻塞的原因詳解

    Golang?channel為什么不會(huì)阻塞的原因詳解

    這篇文章主要為大家介紹了Golang?channel為什么不會(huì)阻塞的原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • go?tool?pprof?參數(shù)?'-base'?和?'-diff_base'之間的區(qū)別解析

    go?tool?pprof?參數(shù)?'-base'?和?'-diff_base&

    這篇文章主要介紹了go?tool?pprof?參數(shù)?'-base'?和?'-diff_base'之間的區(qū)別,兩個(gè)參數(shù)都是用于計(jì)算當(dāng)前?profile文件減去基準(zhǔn)profile文件所獲得的差值,用這個(gè)差值生成一個(gè)新的profile文件,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 瞅一眼就能學(xué)會(huì)的GO并發(fā)編程使用教程

    瞅一眼就能學(xué)會(huì)的GO并發(fā)編程使用教程

    隨著互聯(lián)網(wǎng)的普及,互聯(lián)網(wǎng)用戶人數(shù)原來(lái)越多,這對(duì)系統(tǒng)的性能帶來(lái)了巨大的挑戰(zhàn)。這個(gè)時(shí)候就需要并發(fā)編程了,本文為大家整理了詳細(xì)的GO并發(fā)編程使用教程,讓你看完就能學(xué)會(huì)
    2023-02-02
  • GOLang單元測(cè)試用法詳解

    GOLang單元測(cè)試用法詳解

    Go語(yǔ)言中自帶有一個(gè)輕量級(jí)的測(cè)試框架testing和自帶的go test命令來(lái)實(shí)現(xiàn)單元測(cè)試和性能測(cè)試。本文將通過(guò)示例詳細(xì)聊聊Go語(yǔ)言單元測(cè)試的原理與使用,需要的可以參考一下
    2022-12-12
  • go日志庫(kù)logrus的安裝及快速使用

    go日志庫(kù)logrus的安裝及快速使用

    這篇文章主要為大家介紹了go日志庫(kù)logrus的安裝及快速使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論