草庐IT

mysql - 与 MysqlStore 的 Golang session 不起作用

coder 2023-07-01 原文

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

有关mysql - 与 MysqlStore 的 Golang session 不起作用的更多相关文章

  1. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  2. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  3. ruby-on-rails - "assigns"在 Ruby on Rails 中有什么作用? - 2

    我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o

  4. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  5. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  6. ruby - 字符串文字前面的 * 在 ruby​​ 中有什么作用? - 2

    这段代码似乎创建了一个范围从a到z的数组,但我不明白*的作用。有人可以解释一下吗?[*"a".."z"] 最佳答案 它叫做splatoperator.SplattinganLvalueAmaximumofonelvaluemaybesplattedinwhichcaseitisassignedanArrayconsistingoftheremainingrvaluesthatlackcorrespondinglvalues.Iftherightmostlvalueissplattedthenitconsumesallrvaluesw

  7. ruby - 为什么这个 eval 在 Ruby 中不起作用 - 2

    你能解释一下吗?我想评估来自两个不同来源的值和计算。一个消息来源为我提供了以下信息(以编程方式):'a=2'第二个来源给了我这个表达式来评估:'a+3'这个有效:a=2eval'a+3'这也有效:eval'a=2;a+3'但我真正需要的是这个,但它不起作用:eval'a=2'eval'a+3'我想了解其中的区别,以及如何使最后一个选项起作用。感谢您的帮助。 最佳答案 您可以创建一个Binding,并将相同的绑定(bind)与每个eval相关联调用:1.9.3p194:008>b=binding=>#1.9.3p194:009>eva

  8. ruby-on-rails - Spring 不起作用。 [未初始化常量 Spring::SID::DL] - 2

    我无法运行Spring。这是错误日志。myid-no-MacBook-Pro:myid$spring/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/lib/spring/sid.rb:17:in`fiddle_func':uninitializedconstantSpring::SID::DL(NameError)from/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/li

  9. ruby-on-rails - Simple_form 必填字段不起作用 - Ruby on Rails - 2

    我在RoR应用程序中有一个提交表单,是使用simple_form构建的。当字段为空白时,应用程序仍会继续下一步,而不会提示错误或警告。默认情况下,这些字段应该是required:true;但即使手动编写也行不通。该应用有3个步骤:NewPost(新View)->Preview(创建View)->Post。我的Controller和View的摘录会更清楚:defnew@post=Post.newenddefcreate@post=Post.new(params.require(:post).permit(:title,:category_id))ifparams[:previewButt

  10. ruby-on-rails - 当我通过 rvm 使用 rails3 时,如何在 ubuntu 上安装 mysql2 gem? - 2

    我正在尝试绕过rails配置这个极其复杂的迷宫。到目前为止,我设法在ubuntu上设置了rvm(出于某种原因,ruby在ubuntu存储库中已经过时了)。我设法建立了一个Rails项目。我希望我的测试项目使用mysql而不是mysqlite。当我尝试“rakedb:migrate”时,出现错误:“!!!缺少mysql2gem。将其添加到您的Gemfile:gem'mysql2'”当我尝试“geminstallmysql”时,出现错误,告诉我需要为安装命令提供参数。但是,参数列表很大,我不知道该选择哪些。如何通过在ubuntu上运行的rvm和mysql获取rails3?谢谢。

随机推荐