Gin處理Session的實(shí)現(xiàn)
1.Session:
Seesion是用戶與計(jì)算機(jī)程序(通常是網(wǎng)絡(luò)瀏覽器或移動(dòng)程序)之間交互的一段時(shí)間.在此期間,用戶執(zhí)行的一系列由程序處理的操作或請(qǐng)求,程序會(huì)維護(hù)有關(guān)活動(dòng)的狀態(tài)信息.例如用戶的身份 偏好和當(dāng)前的Session數(shù)據(jù).
2.Session作用:
保持用戶登錄狀態(tài):即使用戶離開程序并稍后返回,仍能保持用戶登錄狀態(tài).
提供個(gè)性化體驗(yàn):根據(jù)用戶之前的交互和偏好,顯示相關(guān)的內(nèi)容或信息.
2.1demo:
package main
import (
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
)
func main() {
request := gin.Default()
//用secret進(jìn)行加密.
store := cookie.NewStore([]byte("secret"))
request.Use(sessions.Sessions("mysession", store))
}
創(chuàng)建了一個(gè)基于Cookie的Session存儲(chǔ).并使用秘鑰進(jìn)行加密.
3.登錄路由設(shè)置Session:
package main
import (
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
request := gin.Default()
request.POST("/login", func(c *gin.Context) {
userName := c.PostForm("username")
passWord := c.PostForm("password")
if userName != "" && passWord != "" {
session := sessions.Default(c)
session.Set("username", userName)
session.Save()
c.JSON(http.StatusOK, gin.H{"message":"登錄成功"})
}else {
c.JSON(http.StatusNotFound, gin.H{"message":"未找到登錄人"})
}
})
}
4.中間件校驗(yàn)Session:
func checkUserName() gin.HandlerFunc {
return func(c *gin.Context) {
userName := sessions.Default(c).Get("username")
if userName == nil {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "未授權(quán)訪問"})
return
}
c.Set("username", userName)
c.Next()
}
}
5.Redis存儲(chǔ)Session:
package main
import (
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/redis"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
request := gin.Default()
store, err := redis.NewStore(10, "tcp", "localhost:6379", "", "", []byte("secret"))
if err != nil {
panic(err)
}
request.Use(sessions.Sessions("mysession", store))
request.POST("/login", func(c *gin.Context) {
userName := c.PostForm("username")
password := c.PostForm("password")
if userName != "" || password != "" {
session := sessions.Default(c)
session.Set("username", userName)
session.Save()
c.JSON(http.StatusOK, gin.H{"message": "登錄成功"})
} else {
c.JSON(http.StatusNotFound, gin.H{"message": "用戶名錯(cuò)誤"})
}
})
}
func checkUserName() gin.HandlerFunc {
return func(c *gin.Context) {
userName := sessions.Default(c).Get("username")
if userName == nil {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "未授權(quán)訪問"})
return
}
c.Set("username", userName)
c.Next()
}
}
上述代碼中利用redis作為Session存儲(chǔ)引擎.首先創(chuàng)建了一個(gè)具有十個(gè)連接池的Redis存儲(chǔ).連接到了位于localhost:6379的服務(wù)器,并使用秘鑰進(jìn)行了加密.
到此這篇關(guān)于Gin處理Session的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Gin處理Session內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Go語言單元測試中解決HTTP網(wǎng)絡(luò)依賴問題
在 Go 語言中,我們需要找到一種可靠的方法來測試 HTTP 請(qǐng)求和響應(yīng),本文將探討在 Go 中進(jìn)行 HTTP 應(yīng)用測試時(shí),如何解決應(yīng)用程序的依賴問題,以確保我們能夠編寫出可靠的測試用例,需要的朋友可以參考下2023-07-07
詳解golang執(zhí)行Linux shell命令完整場景下的使用方法
本文主要介紹了golang執(zhí)行Linux shell命令完整場景下的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
golang使用sort接口實(shí)現(xiàn)排序示例
這篇文章主要介紹了golang使用sort接口實(shí)現(xiàn)排序的方法,簡單分析了sort接口的功能并實(shí)例演示了基于sort接口的排序?qū)崿F(xiàn)方法,需要的朋友可以參考下2016-07-07
盤點(diǎn)總結(jié)2023年Go并發(fā)庫有哪些變化
這篇文章主要為大家介紹了2023年Go并發(fā)庫的變化盤點(diǎn)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
使用Go+GoQuery庫實(shí)現(xiàn)頭條新聞采集
在本文中,我們將介紹如何使用Go語言和GoQuery庫實(shí)現(xiàn)一個(gè)簡單的爬蟲程序,用于抓取頭條新聞的網(wǎng)頁內(nèi)容,我們還將使用爬蟲代理服務(wù),提高爬蟲程序的性能和安全性,我們將使用多線程技術(shù),提高采集效率,最后,我們將展示爬蟲程序的運(yùn)行結(jié)果和代碼,需要的朋友可以參考下2023-10-10
Go語言使用Goroutine并發(fā)打印的項(xiàng)目實(shí)踐
本文通過并發(fā)打印任務(wù)案例,講解Go語言Goroutine的使用、同步控制及高并發(fā)優(yōu)勢,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08

