gorilla/securecookie /gorilla/sessions

本文介绍使用Go语言进行HTTP会话管理的方法,并演示如何创建安全的Cookie以存储用户数据。通过示例代码展示了单一会话及多会话的处理方式,同时涉及了安全Cookie的设置与获取过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var store = sessions.NewCookieStore([]byte("something-very-secret"))

func MyHandler(w http.ResponseWriter, r *http.Request) {

    session, err := store.Get(r, "s1")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    fmt.Println(session)
    session.Values["name"] = "kingeastensun"
    session.Save(r, w)
}

func MultiSessionHandler(w http.ResponseWriter, r *http.Request) {
    session1, err := store.Get(r, "s1")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    fmt.Println(session1)
    session1.Values["name"] = "kingeastensun"

    session2, err := store.Get(r, "s2")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    fmt.Println(session2)
    session2.Values["name"] = "kingeastensunyx"
    sessions.Save(r, w)

}

var hashKey = []byte("1111111111111111")
var blockKey = []byte("1111111111111111")
var sc = securecookie.New(hashKey, blockKey)

// func init() {
//  codecs := securecookie.CodecsFromPairs(
//      []byte("new-hash-key"),
//      []byte("new-block-key"),
//      []byte("old-hash-key"),
//      []byte("old-block-key"),
//  )

//  for _, code := range codecs {
//      if cookie, ok := code.(*securecookie.SecureCookie); ok == true {
//          cookie.MaxAge(86400 * 7)
//          cookie.SetSerializer(securecookie.JSONEncoder{})
//          cookie.HashFunc(sha512.New512_256)
//      }
//  }
// }

func SetCookieHandler(w http.ResponseWriter, r *http.Request) {
    value := map[string]string{
        "name": "kingeasternsun",
    }
    if svalue, err := sc.Encode("kes", &value); err == nil {
        ck := &http.Cookie{
            Name:  "kes",
            Value: svalue,
        }
        http.SetCookie(w, ck)
    } else {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}

func GetCookieHandler(w http.ResponseWriter, r *http.Request) {
    if cValue, err := r.Cookie("kes"); err == nil {
        value := make(map[string]string)
        if err = sc.Decode("kes", cValue.Value, &value); err == nil {
            fmt.Fprintf(w, "The value of n ame is %q", value["name"])
        }
    }

}

func main() {
    // fmt.Println(string(securecookie.GenerateRandomKey(32)))
    // fmt.Println(string(securecookie.GenerateRandomKey(32)))
    routes := mux.NewRouter()
    routes.HandleFunc("/session", MyHandler)
    routes.HandleFunc("/musession", MultiSessionHandler)
    routes.HandleFunc("/setcookie", SetCookieHandler)
    routes.HandleFunc("/getcookie", GetCookieHandler)

    http.Handle("/", routes)
    http.ListenAndServe(":8080", nil)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值