golang会话变量不起作用

时间:2016-09-17 08:26:38

标签: session go

我尝试了以下代码。我第一次打开页面时,usernamenil,下一次,该值变成了真实姓名。

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函数之后立即设置会话(因为在演示中,它可以工作),它仍然不起作用。

当我删除符号下方的代码时,它再次有效!

有什么问题吗?请帮忙!

0 个答案:

没有答案