可以使用 gorilla/sessions 进行跨服务器会话吗? 假设我有多个服务器来为一个网站提供服务。 如果用户登录一台服务器,我希望他也登录另一台服务器。
@CasperHK这就是默认情况下使用 cookie 获得的结果:只要服务器都是同一域的一部分(例如 github.com 或 *.github.com),则 cookie 将由浏览器发送。
或者,会话也支持服务器端存储——所有服务器都需要能够连接到该存储(无论是 Redis 还是 PostgreSQL 等)。
gorilla/session
对我的任务来说似乎很棒。 实际上,我想在我大学的最后一年项目中使用 Go,现在我在同一个域下有 12 个 ubuntu 服务器。 其中一些将用作 Web 服务器,一个将用作 MySQL 数据库服务器。 因此,我想实现一个基于 MySQL 的会话服务,以允许在所有 Web 服务器中同步会话数据。
以前,我尝试编写基于 MySQL 的跨服务器会话。 如果srinathgs/mysqlstore
提供了一种更简单的方法来做同样的事情,那么学习和简化我的工作对我来说很棒。
使用默认的 CookieStore,如果所有服务器都有相同的签名密钥,
并且存在于同一个域中,它将按原样工作。
2016 年 7 月 24 日星期日晚上 10:48 Casper LI [email protected]写道:
gorilla/session 对我的任务来说似乎很棒。 实际上,我想在我的
我大学的最后一年项目,现在我有 12 个 ubuntu 服务器
同一个域。 其中一些将用作网络服务器,一个将用作
用作 MySQL 数据库服务器。 因此,我想实现一个
基于 MySQL 的会话服务,允许会话数据在所有网络中同步
服务器。
以前,我尝试编写基于 MySQL 的跨服务器会话。 如果 ”
github.com/gorilla/sessions”提供了一种更简单的方法来做同样的事情,它是
非常适合我学习和简化我的工作。—
你收到这个是因为你被分配了。直接回复本邮件,在GitHub上查看
https://github.com/gorilla/sessions/issues/87#issuecomment -234845955,
或静音线程
https://github.com/notifications/unsubscribe-auth/AABIcNfC7H8DrZq5NX1Tu7W_Vd1LM5BIks5qZE43gaJpZM4JTizF
.
不好意思,我想问一下默认的 CookieStore 和签名密钥是什么? CookieStore 的意思是gorilla/sessions
包?
是的。 看看http://www.gorillatoolkit.org/pkg/sessions -
something-very-secret
是签名密钥sessions.NewCookieStore
返回*CookieStore
,它不需要服务器之间的数据库/共享状态。import (
"net/http"
"github.com/gorilla/sessions"
)
var store = sessions.NewCookieStore([]byte("something-very-secret"))
func MyHandler(w http.ResponseWriter, r *http.Request) {
// Get a session. We're ignoring the error resulted from decoding an
// existing session: Get() always returns a session, even if empty.
session, err := store.Get(r, "session-name")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// Set some session values.
session.Values["foo"] = "bar"
session.Values[42] = 43
// Save it before we write to the response/return from the handler.
session.Save(r, w)
}
我已经阅读了代码。 当我看着
var store = sessions.NewCookieStore([]byte("something-very-secret"))
我想知道在整个项目中是否在每个处理程序中都使用了store
变量。 如果是这样,看来我需要将其包装在另一个包中并导出。 这是因为我根据它们所服务的页面将不同包中的所有不同处理程序分开(例如index
、 projbrwsr
、 codeeditor
)并且这些处理程序必须调用相同的Store
。
据说something-very-secret
是一个秘密密钥,但我不知道应该将什么传递给函数NewCookieStore()
。
将 store (sessions.Store) 作为依赖项注入到其他包中。
2016 年 7 月 25 日星期一上午 8:57 Casper LI [email protected]写道:
我已经阅读了代码。 当我看着
var store = session.NewCookieStore([]byte("something-very-secret"))
我想知道是否在每个处理程序中都使用了 store 变量
该项目。 如果是这样,看来我需要将它包装在另一个包装中并
让它出口。 这是因为我将所有不同的处理程序分开
根据它们服务的页面不同的包,(例如索引,
projbrwsr、codeeditor) 和那些处理程序必须调用同一个 Store。
[图像:图像]
https://cloud.githubusercontent.com/assets/6957401/17107410/a34dcc50-52c1-11e6-92f7-a4227da60244.png—
你收到这个是因为你被分配了。直接回复本邮件,在GitHub上查看
https://github.com/gorilla/sessions/issues/87#issuecomment -234996994,
或静音线程
https://github.com/notifications/unsubscribe-auth/AABIcOHzeq8IabUoj-SZx_B-7er-PJf9ks5qZNzsgaJpZM4JTizF
.
一些非常秘密的东西据说是一个秘密密钥,但我不知道应该将什么传递给函数 NewCookieStore()。
https://godoc.org/github.com/gorilla/sessions#NewCookieStore
密钥成对定义以允许密钥轮换,但常见情况是设置单个身份验证密钥和可选的加密密钥。
一对中的第一个密钥用于身份验证,第二个用于加密。 在最后一对中可以将加密密钥设置为 nil 或省略,但在所有对中都需要身份验证密钥。
NewCookieStore
采用身份验证/签名密钥和(可选)加密密钥。
抱歉,我刚接触 Go。 你能解释更多关于Inject store
或给我一个解释的链接吗? 谢谢你。
@CasperHK让你的包的构造函数接受它们的依赖——例如
NewProjectBrowser(store sessions.Store, debug bool) (*ProjectBrowser, error) { ... }
NewCodeEditor(store sessions.Store) (*CodeEditor, error) { ... }
在main.go
func main() {
// Create a store, and then pass it (inject it) into your other packages via their constructors
store := sessions.NewCookieStore(key)
...
ce, err := package.NewCodeEditor(store)
...
pb, err := package.NewProjectBrowser(store)
...
}
由于不活动而关闭。
最有用的评论
@CasperHK这就是默认情况下使用 cookie 获得的结果:只要服务器都是同一域的一部分(例如 github.com 或 *.github.com),则 cookie 将由浏览器发送。
或者,会话也支持服务器端存储——所有服务器都需要能够连接到该存储(无论是 Redis 还是 PostgreSQL 等)。