mysql - 与 MysqlStore 的 Golang session 不起作用

标签 mysql session go

我在一个请求上设置 session 并在另一个页面请求上获取它们时遇到问题。

我正在使用 mysqlstore 包,该包在自述文件的“存储实现”部分下的 gorilla sessions github 页面上推荐。

https://github.com/srinathgs/mysqlstore

我设置了一个简单的请求来测试它,但它不起作用。这是代码:

家庭 Controller

func (this *HomeController) SetCookie(ctx types.AppContext) web.HandlerType {

    return func(c web.C, w http.ResponseWriter, r *http.Request) {

        w.Header().Set("Content-Type", "text/plain")

        fmt.Printf("%v\n\n", r)
        ctx.SetCookies(r, w)
    }
}

func (this *HomeController) GetCookie(ctx types.AppContext) web.HandlerType {

    return func(c web.C, w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "text/plain")

        fmt.Printf("%v\n\n", r)
        ctx.GetCookies(r)
    }
}

types.AppContext

func (this *AppContext) SetCookies(r *http.Request, w http.ResponseWriter) {

    fmt.Println("Setting cookies")
    session, _ := this.store.Get(r, "session-name")
    // Set some session values.
    session.Values["foo"] = "bar"
    session.Values[42] = 43
    // Save it before we write to the response/return from the handler.
    err := session.Save(r, w)

    if err != nil {
        fmt.Println("Problem Saving session data")
    }

}
func (this *AppContext) GetCookies(r *http.Request) {

    session, _ := this.store.Get(r, "session-name")
    fmt.Println("Getting cookies")
    // get some session values
    for k, v := range session.Values {
        fmt.Println("Key:", k)
        fmt.Println("Value:", v)
    }

}

ma​​in.go

ctx.SetStore("sessions", "/", 3600, []byte("somesecret"))

....

goji.Get("/set-cookie", homeCtrl.SetCookie(ctx))
goji.Get("/get-cookie", homeCtrl.GetCookie(ctx))

当我访问这两个页面时,我没有收到任何错误,而且我可以在数据库中看到一个 session 已保存。但是,当我尝试检索保存的 cookie 时,session.Values 映射为空。

当我打印出请求时,我得到以下内容(格式化以便于查看):

&{
    GET /get-cookie HTTP/1.1 1 1 
    map[
        Connection:[keep-alive] 
        User-Agent:[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36] 
        Cookie:[session-name=MTQ0MDQ4MjU0M3xCUXdBQWpJM3x3xeRstTXbooJerGOhzP2pvEmqIkisE1XjS76zI365pA==] 
        Accept-Language:[en,en-CA;q=0.8,en-US;q=0.6,ja;q=0.4] 
        Cache-Control:[max-age=0] 
        Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8] 
        Upgrade-Insecure-Requests:[1] 
        Accept-Encoding:[gzip, deflate, sdch]
    ] 
    0x66a9a0 0 [] 
    false localhost:8000 map[] 
    map[] 
    <nil> 
    map[] 
    [::1]:62375 
    /get-cookie 
    <nil>
}

如您所见,我正在发送一个 cookie,它是“session-name”。在 Chrome 中,当我查看 cookie 时,我也可以在本地看到它。

Name: session-name
Value: MTQ0MDQ4MjU0M3xCUXdBQWpJM3x3xeRstTXbooJerGOhzP2pvEmqIkisE1XjS76zI365pA
Domain: localhost
Path: /
Expires/Max-Age: 2015-08-25T07:02:23.347Z (it was about 10:50pm - 11:00pm when I tested this out)

我一直在看这个,但不明白为什么它不起作用。这是我所能做的最简单的事情,根据示例,这应该可行,但事实并非如此。我的代码中是否缺少某些使其工作的东西?

最佳答案

所以我通过一些挖掘找到了答案。当我在 mysqlstore 包中记录一些错误时,我发现了这个小错误,这让我找到了解决方案:

panic :sql:列索引 2 上的扫描错误:不支持的驱动程序 -> 扫描对:[]uint8 -> *time.Time

然后我用谷歌搜索了一下,在这里找到了关于这个问题的讨论:

https://github.com/go-sql-driver/mysql/issues/9

基本上我没有很好地阅读示例。这一直在包的自述文件中。我忘记在我的 mysql 连接凭证的末尾添加查询字符串 ?parseTime=true&loc=Local

所以在设置我的数据库时基本上解决方案是这样的:

db, err := sql.Open("mysql", "username:password@/dbname?parseTime=true&loc=Local")

关于mysql - 与 MysqlStore 的 Golang session 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32196888/

相关文章:

php - 以月、日、分或秒显示相关日期格式?

php - 销毁特定用户的所有 session

regex - golang正则表达式获取包含搜索字符的字符串

html - 如何在 Gin 上返回 html?

Golang websocket客户端,获取结果后关闭连接

mysql - 表不存在,但确实存在

MySQL json 函数 - 按 DATE 查询

Mysql 与 union 和 in 子句错误

php - 当用户关闭(弹出)窗口时调用一些 JavaScript

php - 由于缓存,CakePHP Flash 消息未显示