国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Gin框架: Cookie和Session在單體架構和分布式架構下的應用

這篇具有很好參考價值的文章主要介紹了Gin框架: Cookie和Session在單體架構和分布式架構下的應用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Gin 中單一Cookie的應用


1 )路由處理

package routers

import (
	"gin-demo/controllers/web"
	"github.com/gin-gonic/gin"
)

func WebRoutersInit(r *gin.Engine) {
	webRouters := r.Group("/")
	{
		webRouters.GET("/", web.WebCtrl{}.Index)
		webRouters.GET("/setcookie", web.WebCtrl{}.SetCookie)
		webRouters.GET("/getcookie", web.WebCtrl{}.GetCookie)
		webRouters.GET("/delcookie", web.WebCtrl{}.DelCookie)
	}
}

2 ) 控制器處理

package web

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

type WebCtrl struct{}

// 設置 cookie
func (con WebCtrl) SetCookie(c *gin.Context) {
	// 設置 cookie
	// 第一個
	c.SetCookie("username", "張三", 3600, "/", "localhost", false, true)
	// 第二個
	c.SetCookie("hobby", "吃飯 睡覺", 5, "/", "localhost", false, true)
	// 響應
	c.String(http.StatusOK, "set cookie")
}

// 獲取 cookie
func (con WebCtrl) GetCookie(c *gin.Context) {
	// 獲取 cookie
	username, _ := c.Cookie("username")
	hobby, _ := c.Cookie("hobby")
	// 響應
	c.String(http.StatusOK, "username=%v----hobby=%v", username, hobby)
}

// 刪除 cookie
func (con WebCtrl) DelCookie(c *gin.Context) {
	// 刪除 cookie
	c.SetCookie("username", "張三", -1, "/", "localhost", false, true) // 刪除一個
	// 響應
	c.String(http.StatusOK, "delete cookie")
}
  • 設置cookie時,設置了兩個不同過期時間的cookie

  • 5s 后第一個cookie 自動丟失

  • 訪問 /delcookie 路由,第二個路由被主動刪除

  • HTTP 是無狀態(tài)協議,當你瀏覽了一個頁面

  • 然后轉到同一個網站的另一個頁面,服務器無法認識到這是同一個瀏覽器在訪問同一個網站

  • 每一次的訪問,都是沒有任何關系的

  • 如果我們要實現多個頁面之間共享數據的話

  • 我們就可以使用 Cookie 或者 Session 實現

  • cookie 是存儲于訪問者計算機的瀏覽器中

  • 可以讓我們用同一個瀏覽器訪問同一個域名的時候共享數據

  • 所以,cookie的功能

    • 保持用戶登錄狀態(tài)
    • 保存用戶瀏覽的歷史記錄
    • 猜你喜歡,智能推薦
    • 電商網站的加入購物車
  • cookie的文檔

    • https://gin-gonic.com/zh-cn/docs/examples/cookie/
  • 設置cookie時的API

    • c.SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
    • 第一個參數 key
    • 第二個參數 value
    • 第三個參數 過期時間
      • 如果只想設置 Cookie 的保存路徑而不想設置存活時間
      • 可以在第三個參數中傳遞 nil
    • 第四個參數 cookie 的路徑
    • 第五個參數 cookie 的路徑 Domain 作用域
      • 本地調試配置成 localhost , 正式上線配置成域名
    • 第六個參數是 secure
      • 當 secure 值為 true 時,cookie 在 HTTP 中是無效,在 HTTPS 中才有效
    • 第七個參數 httpOnly
      • 是微軟對 COOKIE 做的擴展, 如果在 COOKIE 中設置了“httpOnly”屬性
      • 則通過程序(JS 腳本、applet 等)將無法讀取到 COOKIE 信息,防止 XSS 攻擊產生

多級域名共享 cookie

  • 不管二級或多級域名,可以設置根域名來共享數據
  • 分別把 a.xyz.com 和 b.xyz.com, 以及 c.b.xyz.com 解析到我們的服務器
  • 我們想的是用戶在 a.xyz.com 中設置 Cookie 信息后
  • 在 b.xyz.com 以及 c.b.xyz.com 中獲取剛才設置的cookie
  • 也就是實現多個二級域名共享 cookie,這時候就可以這樣設置 cookie
  • c.SetCookie("usrename", "張三", 3600, "/", ".xyz.com", false, true)

單體架構 基于 cookie 存儲 session


概述

1 ) 單單使用 cookie 的限制

  • 單單基于 cookie 的設定,只能讀取單個客戶端中的數據,不能做到數據在服務端共享
  • 服務端Cookie技術是將數據存儲在用戶的瀏覽器上,每次瀏覽器發(fā)送請求時
  • 都會攜帶這些Cookie數據發(fā)送到服務器。Cookie的大小通常受到限制
  • 大多數瀏覽器對單個Cookie的大小有4096字節(jié)的限制
  • 盡管現在一些新的瀏覽器和客戶端設備支持更大的Cookie
  • 此外,用戶可以選擇禁用Cookie功能,這會影響Cookie的正常使用

2 )基于 cookie 的 session 技術

  • 與Cookie不同,Session技術將數據存儲在服務器上
  • 這意味著Session沒有存儲大小的限制,只受限于服務器的內存大小
  • Session在用戶訪問期間一直存在在服務器上,直到會話結束或服務器決定刪除它
  • 由于Session存儲在服務器上,因此相比Cookie,它更安全,不容易被篡改
  • 但是,如果服務器上有大量的Session,會占用較多的服務器資源
  • 可能會影響服務器的性能

示例

1 )主程序配置 在 main.go 中

package main

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

func main() {
	// 創(chuàng)建一個默認的路由引擎
	r := gin.Default()
	
	// ... 跳過其他
	
	// 在路由配置之上,配置session中間件
	cookieSessionSecret := "sdfdssdsfs_s?d2sdfsf@^s_" // 是用于加密的密鑰
	// 創(chuàng)建基于 cookie 的存儲引擎
	store := cookie.NewStore([]byte(cookieSessionSecret))
	// 配置session的中間件 store是前面創(chuàng)建的存儲引擎,我們可以替換成其他存儲引擎
	r.Use(sessions.Sessions("xxproject_session", store))
	
	// ... 跳過其他
}

2 ) 路由配置

package routers

import (
	"gin-demo/controllers/web"
	"github.com/gin-gonic/gin"
)

func WebRoutersInit(r *gin.Engine) {
	webRouters := r.Group("/")
	{
		webRouters.GET("/", web.WebCtrl{}.Index)
		webRouters.GET("/setsession", web.WebCtrl{}.SetSession)
		webRouters.GET("/getsession", web.WebCtrl{}.GetSession)
		webRouters.GET("/delsession", web.WebCtrl{}.DelSession)
	}
}

3 ) controller 控制器

package web

import (
	"net/http"
	"github.com/gin-contrib/sessions" // 則個是用于 直接獲取 cookie 內容的
	"github.com/gin-gonic/gin"
)

type WebCtrl struct{}

// 設置 session
func (con WebCtrl) SetSession(c *gin.Context) {
	session := sessions.Default(c)
	// 配置session的過期時間
	session.Options(sessions.Options{
		// MaxAge: 3600 * 6, // 6hrs   MaxAge單位是秒
		MaxAge: 5, // 5 s 過期
	})
	session.Set("username", "張三 111")
	session.Save() // 設置session的時候必須調用
	// 響應
	c.String(http.StatusOK, "set session: %v", session.Get("username"))
}

// 獲取 session
func (con WebCtrl) GetSession(c *gin.Context) {
	session := sessions.Default(c)
	username := session.Get("username")
	// 響應
	c.String(http.StatusOK, "get session username=%v", username)
}

// 刪除 session
func (con WebCtrl) DelSession(c *gin.Context) {
	session := sessions.Default(c)
	session.Delete("username")
	session.Save() // 這將從 Cookie中 中刪除 session 數據
	username := session.Get("username") // 獲取 session username
	// 響應
	c.String(http.StatusOK, "delete session %v", username)
}
  • 基于cookie的 session 技術如上是基本使用程序
  • 需要注意的是,關于 session 刪除同步到 cookie 刪除是自動設置的
  • 調用 session 的 Delete 和 Save 方法來更新 Cookie
  • 由于 session 數據已經被刪除,這個操作會創(chuàng)建一個新的、空的 Cookie
  • 這實際上會導致瀏覽器端的舊 Cookie 過期并被刪除,所以無需我們控制cookie

分布式架構下 基于 redis 存儲 session


概述

  • 如果項目部署在多臺機器上,單體架構下的session無法共享,需要借助第三方來同步數據
  • 這時候就會用到 redis 或其他服務器存儲技術,在負載均衡下的多臺機器共享數據的場景
  • 就是分布式架構下的 session 應用場景

示例

1 )主程序 main.go

package main

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

func main() {
	// 創(chuàng)建一個默認的路由引擎
	r := gin.Default()
	
	// ... 跳過其他
	
	// 在路由配置之上,配置session中間件
	redisSessionSecret := "sdfdssdsfs_s?d2sdfsf@^s_" // 是用于加密的密鑰
	// 配置session中間件
	
	store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte(redisSessionSecret))
	r.Use(sessions.Sessions("mysession", store))

	// ... 跳過其他
}

2 ) 路由和控制器同上面的 cookie based session 示例,這里不再贅述

3 )注意文章來源地址http://www.zghlxwxcb.cn/news/detail-835651.html

  • 初始化基于 redis 的session存儲引擎, 參數說明:
    • 第 1 個參數 - redis 最大的空閑連接數
    • 第 2 個參數 - 數通信協議 tcp 或者 udp
    • 第 3 個參數 - redis 地址, 格式,host:port
    • 第 4 個參數 - redis 密碼
    • 第 5 個參數 - session 加密密鑰
  • 同步刪除 session 的時候,redis 的數據也會被同步刪除,同時瀏覽器的Cookie數據也會同步消失
  • 有時候需要手動刪除,比如客戶端調用退出登錄接口的時候,手動調用 session的刪除和保存方法

其他

  • 關于多 session 和 其他存儲引擎的 session 都在文檔中
  • 參考:https://github.com/gin-contrib/sessions

到了這里,關于Gin框架: Cookie和Session在單體架構和分布式架構下的應用的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Dubbo——微服務框架(單體式->分布式->微服務)

    Dubbo——微服務框架(單體式->分布式->微服務)

    Dubbo是阿里巴巴開源的基于Java的高性能RPC(一種遠程調用)分布式服務框架,致力于提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動注冊和發(fā)現。; 每天為2千多個服

    2024年02月05日
    瀏覽(31)
  • 四大軟件架構:掌握單體、分布式、微服務、Serverless 的精髓

    四大軟件架構:掌握單體、分布式、微服務、Serverless 的精髓

    簡介: 如果一個軟件開發(fā)人員,不了解軟件架構的演進,會制約技術的選型和開發(fā)人員的生存、晉升空間。這里我列舉了目前主要的四種軟件架構以及他們的優(yōu)缺點,希望能夠幫助軟件開發(fā)人員拓展知識面。 單體架構比較初級,典型的三級架構,前端(Web/手機端)+中間業(yè)務邏

    2024年01月17日
    瀏覽(40)
  • 【數據網格架構】分布式數據網格作為集中式數據單體的解決方案

    【數據網格架構】分布式數據網格作為集中式數據單體的解決方案

    企業(yè)數據架構師不應構建大型集中式數據平臺,而應創(chuàng)建分布式數據網格。?ThoughtWorks 的首席技術顧問 Zhamak Dehghani 在舊金山 QCon 的演講和相關文章中表示,這種方法的改變需要范式轉變。隨著數據變得越來越普遍,傳統的數據倉庫和數據湖架構變得不堪重負,無法有效擴展

    2024年02月11日
    瀏覽(19)
  • 下一代服務架構:單體架構-->分布式架構-->微服務(DDD)-->軟件定義架構(SDF with GraphEngine)

    下一代服務架構:單體架構-->分布式架構-->微服務(DDD)-->軟件定義架構(SDF with GraphEngine)

    參考:自己實現一個SQL解析引擎_曾經的學渣的博客-CSDN博客 ? ?

    2024年02月12日
    瀏覽(92)
  • 深度解析四大主流軟件架構模型:單體架構、分布式應用、微服務與Serverless的優(yōu)缺點及場景應用

    深度解析四大主流軟件架構模型:單體架構、分布式應用、微服務與Serverless的優(yōu)缺點及場景應用

    ???? 博主貓頭虎 帶您 Go to New World.??? ?? 博客首頁——貓頭虎的博客?? ??《面試題大全專欄》 文章圖文并茂??生動形象??簡單易學!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍專欄》學會IDEA常用操作,工作效率翻倍~?? ?? 《100天精通Golang(基礎入門篇)》學會Golang語言

    2024年02月06日
    瀏覽(93)
  • SpringCloud溯源——從單體架構到微服務Microservices架構 & 分布式和微服務 & 為啥要用微服務

    SpringCloud溯源——從單體架構到微服務Microservices架構 & 分布式和微服務 & 為啥要用微服務

    單體架構好好的,為啥要用微服務呢?微服務究竟是啥,怎么來的,有啥優(yōu)缺點,本篇博客嘗試追根溯源,闡述單體應用到分布式,微服務的演變,微服務架構的定義及優(yōu)缺點,厘清相關的概念。 1.網絡架構變遷史:單體—SOA----微服務; 2.分布式系統,多節(jié)點,springcloud是第二

    2024年02月06日
    瀏覽(24)
  • [架構之路-221]:鴻蒙系統和安卓系統的比較:微內核VS宏內核, 分布式VS單體式

    [架構之路-221]:鴻蒙系統和安卓系統的比較:微內核VS宏內核, 分布式VS單體式

    目錄 一、鴻蒙系統和安卓系統的系統架構 1.1?鴻蒙系統的分層架構 1.2?安卓系統的分層架構 1.3?鴻蒙系統和安卓系統是操作系統嗎? 二、鴻蒙系統和安卓系統的系統架構比較 2.1 它們與Linux操作系統的關系 2.2 架構比較 三、操作系統基礎 3.1 微內核架構 3.2 宏內核架構 3.3 傳統

    2024年02月07日
    瀏覽(24)
  • 微服務架構-服務網關(Gateway)-權限認證(分布式session替代方案)

    微服務架構-服務網關(Gateway)-權限認證(分布式session替代方案)

    前面我們了解了Gateway組件的過濾器,這一節(jié)我們就探討一下Gateway在分布式環(huán)境中的一個具體用例-用戶鑒權。 從我們開始學JavaEE的時候,就被洗腦式灌輸了一種權限驗證的標準做法,那就是將用戶的登錄狀態(tài)保存到HttpSession中,比如在登錄成功后保存一對key-value值到session,

    2024年02月16日
    瀏覽(23)
  • Gin 框架之Cookie與Session

    Gin 框架之Cookie與Session

    我們知道 HTTP協議無連接 的, 也就是不保存用戶的狀態(tài)信息。 早期(十幾年前)的網頁是靜態(tài)的, 數據都是寫死的, 人們訪問網頁只是用來查看新聞的, 沒有保存用戶狀態(tài)的需求。 而往后出現了像論壇、博客、網購這一類需要保存用戶信息的網站, 如果網站不保存用戶的狀態(tài)信息

    2024年01月20日
    瀏覽(27)
  • Java單體到分布式進階,分布式到高可用進階,單體到微服務進

    Java單體到分布式進階,分布式到高可用進階,單體到微服務進

    鵝廠實習第十周 研二下了論文沒有實習沒有怎么辦 數據分析求職Happy Ending 獻上我的面經和回答思路 求求大家投下我們鵝廠吧 五年職場人,今做面試官,我來揭秘大學生校招內幕! 五年職場人,今做面試官,我來揭秘大學生校招內幕! 京東Java實習一面 機械轉碼前端上岸,

    2024年03月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包