我尝试了以下代码。我第一次打开页面时,username
为nil
,下一次,该值变成了真实姓名。
func sayHello(w http.ResponseWriter, r *http.Request) {
sess, _ := globalSessions.SessionStart(w, r)
defer sess.SessionRelease(w)
username := sess.Get(r.FormValue("name"))
fmt.Println(username)
sess.Set(r.FormValue("name"), r.FormValue("name"))
}
但是,当我要实现一些复杂的功能时,会话不起作用。
func loginHandler(w http.ResponseWriter, r *http.Request) {
var (
query url.Values
err error
userInfo daomanage.User
statusInfo StatusInfo
)
cookie, err := r.Cookie("gosessionid")
sess, _ := globalSessions.SessionStart(w, r)
defer sess.SessionRelease(w)
sessionCache := sess.Get(cookie.Value)
log.Println("newcache", sessionCache, cookie.Value)
sess.Set(cookie.Value, cookie.Value)
// symbol xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
if sessionCache != nil {
statusInfo.Status = 200
statusInfo.Info = userInfo.Username
data, _ := json.Marshal(statusInfo)
fmt.Fprintf(w, string(data))
return
}
query, err = url.ParseQuery(r.URL.RawQuery)
if err != nil {
log.Println("Parse Error", err)
return
}
// Get user info
if s, ok := query["username"]; ok {
userInfo, err = daomanage.GetUserInfo("username", s[0])
if err == nil {
if p, ok := query["password"]; ok {
if p[0] == userInfo.Password {
sess.Set(s[0], s[0])
log.Println(sess.Get(s[0]))
tNow := time.Now()
cookie := http.Cookie{Name: "gosessionid", Value: s[0], Expires: tNow.AddDate(1, 0, 0)}
http.SetCookie(w, &cookie)
statusInfo.Status = 200
statusInfo.Info = userInfo.Username
data, _ := json.Marshal(statusInfo)
fmt.Fprintf(w, string(data))
return
}
}
}
}
statusInfo.Status = 400
statusInfo.Info = InfoLoginFailed
data, _ := json.Marshal(statusInfo)
fmt.Fprintf(w, string(data))
return
}
我一次又一次地将查询发送给函数,但函数sess.Get(cookie.Value)
什么都不返回。我甚至试图在get
函数之后立即设置会话(因为在演示中,它可以工作),它仍然不起作用。
当我删除符号下方的代码时,它再次有效!
有什么问题吗?请帮忙!