go - gorilla cookie session 会持续服务器重建吗?

标签 go gorilla

我正在使用以下代码在我的包中传递当前 session 。我正在用 fresh 构建它来监视我的文件。似乎在构建 cookie 后不再有效?我已经尝试过 cookie 存储和 mysql 存储。我已确认 cookie 仍在浏览器中,行项目仍在数据库中。

var sessionStore = sessions.NewCookieStore([]byte(os.Getenv("SESSION_SECRET")))


var sessionPointer *sessions.Session; 


func initSession(r *http.Request) *sessions.Session {


    if sessionPointer == nil { 

    } else{ 
        return sessionPointer; 
    }


    temp, err := sessionStore.Get(r,os.Getenv("SESSION_NAME"))

    sessionPointer = temp;

    sessionPointer.Options = &sessions.Options{

        Path: "/",

            MaxAge: 86400 * 1,

            HttpOnly: false,

    }

    if err != nil {
        panic(err)
    }
    return sessionPointer
}

最佳答案

问题很可能是您正在“共享” session 。一个 session 应该属于一个请求。但是当你这样做时:

var sessionPointer *sessions.Session; 


func initSession(r *http.Request) *sessions.Session {
    if sessionPointer == nil { 

    } else{ 
        return sessionPointer; 
    }


    temp, err := sessionStore.Get(r,os.Getenv("SESSION_NAME"))

    sessionPointer = temp;

    // ...
}

您实际上是在说“如果任何 session 已创建,则返回它”。这意味着每个请求(和每个用户)都将获得相同的 session 。我不确定他们是如何将请求与特定 session 匹配的,但我认为每次将它与新请求匹配时都不会调用 sessionStore.Get,最终会设置一些东西使其不再有效的 session (因为该 session 实际上并不属于该请求)。

好消息是没有理由缓存sessionPointer。无论如何,它在内部使用 map ,而且查找基本上是免费的。我会将您的代码更改为:

func initSession(r *http.Request) *sessions.Session {
    temp, err := sessionStore.Get(r,os.Getenv("SESSION_NAME"))
    if err != nil {
        panic(err)
    }
    sessionPointer.Options = &sessions.Options{
        Path: "/",
        MaxAge: 86400 * 1,
        HttpOnly: false,
    }
    return sessionPointer
}

然后我会认为一切都会按预期进行。

关于go - gorilla cookie session 会持续服务器重建吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51524698/

相关文章:

go - 在 gorilla mux 路由器上设置 404 NotFound 处理程序

go - 带 gorilla 复用器的速率限制器

go - 如何在 golang 中传递 http 请求?

mongodb - 谷歌应用引擎 : One To Many relations in Go

go - Docker撰写NGINX反向代理502

rest - Go Gorilla Mux 没有按预期路由

go - 如果websocket握手超时设置为0,会发生什么情况

go - 在多个goroutine之间共享的Golang结构中,非共享成员是否需要互斥保护?

go - standard_init_linux.go :207: exec user process caused "no such file or directory" while trying to statically link c libs

recursion - 递归 Goroutines,告诉 Go 停止从 channel 读取的最简洁方法是什么?