1. 程式人生 > 其它 >gin框架 會話控制

gin框架 會話控制

★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)
}