gpt4 book ai didi

session - session 的最佳实践( gorilla / session )

转载 作者:IT老高 更新时间:2023-10-28 13:10:56 31 4
gpt4 key购买 nike

在开始在 golang 中使用 session 之前,我需要回答一些问题

session 示例

import "github.com/gorilla/sessions"

var store = sessions.NewCookieStore([]byte("33446a9dcf9ea060a0a6532b166da32f304af0de"))

func Handler(w http.ResponseWriter, r *http.Request){
session, _ := store.Get(r, "session-name")

session.Values["foo"] = "bar"
session.Values[42] = 43
session.Save(r, w)

fmt.Fprint(w, "Hello world :)")
}

func main(){
store.Options = &sessions.Options{
Domain: "localhost",
Path: "/",
MaxAge: 60 * 15,
Secure: false,
HttpOnly: true,
}
}

第一季度:

是否可以在同一个域上添加多个不同名称的 session ?

session1, _ := store.Get(r, "session-name-1")
session2, _ := store.Get(r, "session-name-2")

您何时需要在同一个域上进行多个 session ?

第二季度:

从 session 中获取变量的最佳做法是什么?my_session_var = session.Values["foo"]

第三季度:

如何检查 session 是否正确保存?如果您访问相同的 map 来设置和获取变量?

更新

package main

import (
"github.com/gorilla/sessions"
)

var (
store = sessions.NewCookieStore([]byte("33446a9dcf9ea060a0a6532b166da32f304af0de"))
)

type handler func(w http.ResponseWriter, r *http.Request, s *sessions.Session)

func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request){
session, _ := store.Get(r, "session-name")

h(w, r, session)
}

func Handler_404(w http.ResponseWriter, r *http.Request, s *sessions.Session){
fmt.Fprint(w, "Oops, something went wrong!")
}

错误

# command-line-arguments
.\mux.go:101: cannot convert Handler_404 (type func(http.ResponseWriter, *http.Request, *sessions.Session)) to type http.HandlerFunc

最佳答案

文章“BASIC EXTENSION OF GO’S HTTP HANDLERS” (Simon Whitehead) 展示了在何时何地定义 session 的示例。
而不是在 Handler 本身中进行,并且在定义其他处理程序时必须复制大量代码。

使用 named type ,你可以定义你需要的Handler:

type handler func(w http.ResponseWriter, r *http.Request, db *mgo.Database)

(在您的情况下,它将是 gorilla session 而不是 mgo session 或数据库)

init() function可以处理 session 创建(这里是mgo session ,但是其他框架 session 的想法是一样的)

func init() {
session, err = mgo.Dial("localhost")

if err != nil {
log.Println(err)
}
}

您可以确保此函数类型('handler')确实尊重 ServeHTTP() 函数,注意:

  • session 管理(克隆/关闭)
  • 调用你的实际处理程序(它可以有更多的参数,而不仅仅是 wr)

    func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    s := session.Clone()
    defer s.Close()

    h(w, r, s.DB("example"))
    }

然后你可以定义你的实际Handler(同样,不仅仅是wr):

func myHandler(w http.ResponseWriter, r *http.Request, db *mgo.Database) {
var users []user

db.C("users").Find(nil).All(&users)

for _, user := range users {
fmt.Fprintf(w, "%s is %d years old", user.Name, user.Age)
}
}

您可以在服务器中使用该处理程序:

func main() {
mux := http.NewServeMux()
mux.Handle("/", handler(myHandler))
http.ListenAndServe(":8080", mux)
}

这个想法是将 main() 中的“管道”限制到最低限度,同时拥有一个具有更多参数(包括您的 session )的 Handler
这允许您使用不同的 Handlers 只需很少的管道,保持 main() 仅用于不同路径的声明(而不是用于 session 和处理程序的初始化)


2019 年更新:在另一个相关上下文中,另请参阅“How to handle sessions”。

关于session - session 的最佳实践( gorilla / session ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26106363/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com