【问题标题】:How to use Redis-based session on Revel如何在 Revel 上使用基于 Redis 的会话
【发布时间】:2014-06-12 09:36:56
【问题描述】:

如何在Revel上使用基于redis的会话?

我找到了this gist,但是不知道怎么用..

编辑#1:

我的环境变量

GOROOT --> /usr/lib/go
GOPATH --> /home/asd/Dropbox/go

我做了什么:

mkdir -p $GOPATH/src/myapp/app/libs/session
curl https://gist.githubusercontent.com/xthexder/9026678/raw/9e40fb56d8991de945a2064b6869bb7280b1305a/session.go \
 > $GOPATH/src/myapp/app/libs/session/session.go
go get github.com/garyburd/redigo
go get github.com/robfig/revel

init.go 上添加import "myapp/app/libs/session",就会出现这个错误:

Go Compilation Error
The Go code Dropbox/go/src/myapp/app/libs/session/session.go does not compile: undefined: Redis

In Dropbox/go/src/myapp/app/libs/session/session.go (around line 75)
70:         panic("Session values may not have null bytes")
71:     }
72:     sessionValue += "\x00" + key + ":" + value + "\x00"
73: }
74:
75: redisConn := Redis.Get()
76: defer redisConn.Close()
77:
78: params := []interface{}{"session:" + sessionToken, sessionValue}
79: if expireAfterDuration != 0 {    

控制台上的错误:

WARN  2014/06/11 20:11:15 build.go:132: Cannot determine git repository version: exit status 128
ERROR 2014/06/11 20:11:15 build.go:84: # myapp/app/libs/session
Dropbox/go/src/myapp/app/libs/session/session.go:75: undefined: Redis
Dropbox/go/src/myapp/app/libs/session/session.go:126: undefined: Redis
Dropbox/go/src/myapp/app/libs/session/session.go:129: not enough arguments in call to redis.String
Dropbox/go/src/myapp/app/libs/session/session.go:172: undefined: Redis
Dropbox/go/src/myapp/app/libs/session/session.go:175: not enough arguments in call to redis.Int

【问题讨论】:

  • 到目前为止您尝试过什么? Gist 相当全面:它有一个 init() 函数、保存和恢复 (get) 会话函数(这些函数会进入您的 HTTP 处理程序)、一个撤销会话助手和一个中间件。
  • 首先,我应该把那个文件(session.go)放在哪里?
  • 最终没关系,但为了简单起见:把它和其他所有东西放在你的主包中。 Go 看不到文件,但看不到包。我建议完整阅读 Effective Go(Google it)和 Revel 文档,或者使用一组更简单的工具来学习(net/http、Gorilla 或 Goji)。基于 Redis 的会话很棒,但听起来你有点超前(通过 HTTPS 加密的 cookie 仍然很好;只是不要在其中存储敏感内容)。
  • 你应该坐下来阅读tip.golang.org/doc/effective_go.html
  • 是的,这是我学习 Go 的第三天,两天前我阅读了 Go Programming Language PhrasebookProgramming in Go,昨天我阅读了 Revel 教程和文档,无论如何谢谢..

标签: session go redis revel


【解决方案1】:

看起来 Gist 已经过时了。 错误就在您的问题中。
Redis 未定义。

首先,包名应该是小写的,一个直接的红旗。查看 github,您可以看到包(现在)应该是小写的。

【讨论】:

    【解决方案2】:

    没关系,我自己解决,修改session.go代码如http://www.diffchecker.com/n0k0fy8w所示

    init.go

    revel.SessionFilter,           // Restore and write the session cookie.
    

    进入

    app.SessionFilter,
    

    在控制器/动作上检查它:

    x, _ := strconv.ParseInt(c.Session["test"], 0, 64)
    x += 1
    c.Session["test"] = fmt.Sprintf("%d", x)
    return c.Render(x)
    

    在模板上

    {{.x}}
    

    访问页面,并使用 redis-cli 验证它

    $ redis-cli get `redis-cli --scan 'session:*'`
    "\x00test:15\x00"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 2014-12-23
      • 2015-09-18
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      相关资源
      最近更新 更多