cookie, err := c.Cookie("user")
if err != nil{
c.JSON(200, gin.H{"msg": err.Error()})
}else{
c.JSON(200, gin.H{"msg": cookie})
}
}

設(shè)置cookie

可以使用SetCookie 方法來設(shè)置cookie,這個方法參數(shù)比較多

func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)

這些參數(shù)的意義如下

func (ApiV1) SetCookie(c *gin.Context)  {
cookie, err := c.Cookie("user")
if err != nil{
c.SetCookie("user", "yangyanxing", 3600, "/", "127.0.0.1",
false, false)
c.JSON(200, gin.H{"msg": "設(shè)置cookie成功"})
}else{
c.JSON(200, gin.H{"msg": cookie})
}
}

刪除cookie

沒有一個方法可以直接刪除cookie,但是可以通過設(shè)置有效期為負數(shù)來達到刪除的目的

比如要刪除掉user這個cookie,其實這時候它的值是多少已經(jīng)無所謂了,可以設(shè)置個空

func (ApiV1) DelCookie(c *gin.Context)  {
c.SetCookie("user", "", -1,"/", "127.0.01", false, false)
c.String(200,"刪除user cookie成功")
}

操作session

cookie 雖然很方便,但是它的安全性還是有些問題,客戶端可以任意的做修改,這時也可以使用session 來存儲狀態(tài)。gin 框架本身不支持session,但是我們可以使用第三方庫 https://github.com/gin-contrib/sessions 來操作session,這個session框架可以將信息存儲在不同的地方

gin-contrib/sessions中間件支持的存儲引擎:

使用cookie存儲

package main

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

func main() {
r := gin.Default()
// 創(chuàng)建基于cookie的存儲引擎,yangyanxing 參數(shù)是用于加密的密鑰
store := cookie.NewStore([]byte("yangyanxing"))
// 設(shè)置session中間件,參數(shù)mysession,指的是session的名字,也是cookie的名字
// store是前面創(chuàng)建的存儲引擎,我們可以替換成其他存儲引擎
r.Use(sessions.Sessions("mysession", store))
apiv1_h := handlers.ApiV1{}
apiv1 := r.Group("/api/v1")
{
apiv1.GET("/session/get", apiv1_h.GetSession)
apiv1.GET("/session/set", apiv1_h.SetSession)

}
r.Run(":8080")
}

store := cookie.NewStore([]byte("yangyanxing")) 這行代碼初始化一個存儲引擎,參數(shù)為密鑰,用于加解密

r.Use(sessions.Sessions("mysession", store)) 這是一個中間件,cookie就是以mysesson為name存儲,store 為上面初始化的存儲引擎。

在處理類中操作session

func (ApiV1) GetSession(c *gin.Context)  {
session := sessions.Default(c)
if value:= session.Get("user"); value==nil{
c.String(200,"在session中沒有user")
}else{
c.String(200, value.(string))
}
}

func (receiver ApiV1) SetSession(c *gin.Context) {
session := sessions.Default(c)
session.Set("user", "yangyanxing")
err := session.Save()
if err != nil {
c.String(200, err.Error())
}
c.String(200, "設(shè)置session成功")
}

注意,對session進行寫操作,如設(shè)置修改刪除等,必須要調(diào)用session.Save() 方法,否則不能生效。

下圖為在chrome中查看到的cookies信息。可以看到,value 是加密的

image-20220105224736107

也可以一次性全部清除

func (ApiV1) ClearSession(c *gin.Context)  {
session := sessions.Default(c)
//session.Delete("user")
session.Clear()
err := session.Save()
if err != nil {
c.String(200, err.Error())
return
}
c.String(200, "清理成功")
}

Delete 為刪除單個值,Clear 為清除所有,但是注意,即使使用了Clear,它只是清除了session中的信息,但是cookie中的mysession還是存在的,但是值是不一樣了。

使用redis 存儲 session

用法和cookie 一樣,只是在初始化存儲引擎的時候不一樣

store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))

參數(shù)說明

「注意:」

使用 「redis.NewStore」 初始化的store 默認使用redis的db0, 更多的時候,我們會使用「redis.NewRediStoreWithDB」 來指定db

store, _ := redis.NewStoreWithDB(10, "tcp", "localhost:6379", "", "8", []byte("secret"))

參考文章

https://www.jianshu.com/p/259b6fda35ea

https://github.com/gin-contrib/sessions

https://www.tizi365.com/archives/288.html

本文章轉(zhuǎn)載微信公眾號@序語程言

上一篇:

Python云計算接口:10個云服務(wù)API的集成方法

下一篇:

使用gin搭建api后臺系統(tǒng)之中間件開發(fā)
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費