Session golang会话变量不工作。我做错了什么?
我正在使用gorilla/sessions包来实现会话。相关代码(或至少我认为唯一相关的部分)如下:Session golang会话变量不工作。我做错了什么?,session,go,Session,Go,我正在使用gorilla/sessions包来实现会话。相关代码(或至少我认为唯一相关的部分)如下: // Function handler for executing HTML code func lobbyHandler(w http.ResponseWriter, req *http.Request) { if isLoggedIn := validateSession(w, req); isLoggedIn { lobbyTempl.Execute(w, req
// Function handler for executing HTML code
func lobbyHandler(w http.ResponseWriter, req *http.Request) {
if isLoggedIn := validateSession(w, req); isLoggedIn {
lobbyTempl.Execute(w, req.Host)
} else {
homeTempl.Execute(w, map[string]string{
"loginErrors": "Must log in first",
})
}
}
// Serves the files as needed, whenever they are requested
// used for all images, js, css, and other static files
func sourceHandler(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, r.URL.Path[1:])
}
func loginHandler(w http.ResponseWriter, r *http.Request) {
un, pw := r.FormValue("lUn"), r.FormValue("lPw")
if usr := findUser(un, pw); usr != nil {
if createSession(w, r) {
http.Redirect(w, req, "/lobby.html", http.StatusFound)
}
} else {
homeTempl.Execute(w, map[string]string{
"loginErrors": "User not found",
})
}
}
func createSession(w http.ResponseWriter, r *http.Request) bool {
session, _ := store.Get(r, sessionName)
session.Values["isAuthorized"] = true
if err := session.Save(r, w); err != nil {
fmt.Println("saving error: ", err.Error())
return false
}
return true
}
func validateSession(w http.ResponseWriter, r *http.Request) bool {
if session, err := store.Get(r, sessionName); err == nil {
if v, ok := session.Values["isAuthorized"]; ok && v == true {
fmt.Println("Authorized user identified!")
return true
} else {
fmt.Println("Unauthorized user detected!")
return false
}
}
return false
}
func main() {
//...
// serving files for the game
http.HandleFunc("/", homeHandler)
http.Handle("/ws", websocket.Handler(wsLobbyHandler))
http.HandleFunc("/lobby.html", lobbyHandler)
http.HandleFunc("/formlogin", loginHandler)
//...
//http.HandleFunc("/*.html", SourceHandler)
if err := http.ListenAndServeTLS(*addr, "cert.pem", "key.pem", nil); err != nil {
log.Fatal("ListenAndServe:", err)
}
}`
在我的html中,我有:
<form id="login_form" action="/formlogin" method="post">
lobbyHandler中的验证无效。这是否与store.Save(…)更改标题有关
我是一个新手,一般来说,我对网络应用也很陌生,所以我非常感谢您的反馈。多亏了这些评论,我才偶然发现了一款适合我的类似产品
session.Options = &sessions.Options{
Path: "/lobby.html",
}
我需要确保Cookie知道它们将被正确重定向到哪里。是否在代码中的其他地方定义了
sessionName
?对不起,一个不可回避的问题:您是否在Firebug或Chrome的inspector中看到过这一点?您可以在登录前后检查cookie头和值。此外,您似乎没有设置任何cookie选项(安全、HttpOnly等)。我认为这与此无关,但可能会影响某些浏览器。请查看Session.Options()。示例如果session.IsNew{session.Options.Secure=true}
您正在使用哪个版本的go?哪个浏览器?请检查这段代码,并尝试在您的环境中运行它。它的工作方式与预期一致TermNet:yes sessionName是在其他地方定义的,我没有在Cookie中使用Firebug/Chrome inspector。谢谢你提醒我饼干的选择。我改变了选择。我在Chrome上使用Go1.1。如果其他人也有类似问题,请检查您的浏览器是否拒绝会话cookie(就像我的一样…)-特别是来自本地主机-我必须在firebug中设置为“允许”。
session.Options = &sessions.Options{
Path: "/lobby.html",
}