gin框架 會話控制
阿新 • • 發佈:2021-06-29
★Cookie介紹
- HTTP是無狀態協議,伺服器不能記錄瀏覽器的訪問狀態,也就是說伺服器不能區分兩次請求是否由同一個客戶端發出
- Cookie就是解決HTTP協議無狀態的方案之一,中文是小甜餅的意思
- Cookie實際上就是伺服器儲存在瀏覽器上的一段資訊。瀏覽器有了Cookie之後,每次向伺服器傳送請求時都會同時將該資訊傳送給伺服器,伺服器收到請求後,就可以根據該資訊處理請求
- Cookie由伺服器建立,併發送給瀏覽器,最終由瀏覽器儲存
★Cookie的使用
package main import ( "github.com/gin-gonic/gin" "fmt" ) func main() {// 1.建立路由 // 預設使用了2箇中間件Logger(), Recovery() r := gin.Default() // 服務端要給客戶端cookie r.GET("cookie", func(c *gin.Context) { // 獲取客戶端是否攜帶cookie cookie, err := c.Cookie("key_cookie") if err != nil { cookie = "NotSet" // 給客戶端設定cookie // maxAge int, 單位為秒// path,cookie所在目錄 // domain string,域名 // secure 是否智慧通過https訪問 // httpOnly bool 是否允許別人通過js獲取自己的cookie c.SetCookie("key_cookie", "value_cookie", 60, "/", "localhost", false, true) } fmt.Printf("cookie的值是: %s\n", cookie) }) r.Run(":8000") }
★Sessions
gorilla/sessions為自定義session後端提供cookie和檔案系統session以及基礎結構。
主要功能是:
- 簡單的API:將其用作設定簽名(以及可選的加密)cookie的簡便方法。
- 內建的後端可將session儲存在cookie或檔案系統中。
- Flash訊息:一直持續讀取的session值。
- 切換session永續性(又稱“記住我”)和設定其他屬性的便捷方法。
- 旋轉身份驗證和加密金鑰的機制。
- 每個請求有多個session,即使使用不同的後端也是如此。
- 自定義session後端的介面和基礎結構:可以使用通用API檢索並批量儲存來自不同商店的session。
package main import ( "fmt" "net/http" "github.com/gorilla/sessions" ) // 初始化一個cookie儲存物件 // something-very-secret應該是一個你自己的密匙,只要不被別人知道就行 var store = sessions.NewCookieStore([]byte("something-very-secret")) func main() { http.HandleFunc("/save", SaveSession) http.HandleFunc("/get", GetSession) err := http.ListenAndServe(":8080", nil) if err != nil { fmt.Println("HTTP server failed,err:", err) return } } func SaveSession(w http.ResponseWriter, r *http.Request) { // Get a session. We're ignoring the error resulted from decoding an // existing session: Get() always returns a session, even if empty. // 獲取一個session物件,session-name是session的名字 session, err := store.Get(r, "session-name") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // 在session中儲存值 session.Values["foo"] = "bar" session.Values[42] = 43 // 儲存更改 session.Save(r, w) } func GetSession(w http.ResponseWriter, r *http.Request) { session, err := store.Get(r, "session-name") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } foo := session.Values["foo"] fmt.Println(foo) }