【问题标题】:Do gorilla cookie sessions persist server rebuilds?gorilla cookie 会话是否会持续服务器重建?
【发布时间】:2018-07-26 02:46:17
【问题描述】:

我正在使用以下代码在整个包中传递当前会话。我正在用新鲜的东西来监视我的文件。似乎构建后的cookies不再有效?我已经尝试过 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
}

【问题讨论】:

  • 您是否在每次构建时更改会话密码或会话名称?
  • 不,它们都是从 env 文件加载的

标签: go gorilla


【解决方案1】:

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

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;

    // ...
}

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

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

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
}

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

【讨论】:

    猜你喜欢
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多