gpt4 book ai didi

mysql - 与 MysqlStore 的 Golang session 不起作用

转载 作者:IT王子 更新时间:2023-10-29 02:15:42 26 4
gpt4 key购买 nike

我在一个请求上设置 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/

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