【问题标题】:Golang Gorilla Sessions do not Save on Windows10Golang Gorilla Sessions 无法在 Windows10 上保存
【发布时间】:2020-03-29 22:07:18
【问题描述】:

我尝试登录、注销以更改值。

调用sessionStore.Save() 与新的session(login) 一起工作。

但是session.Save(r, w)、sessions.Save(r, w)、store.Save(r, w, session) 没有

使用 Windows 10 无法正常工作。

我认为原因是 Windows 权限。

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/sessions"
)

var (
    // key must be 16, 24 or 32 bytes long (AES-128, AES-192 or AES-256)
    key = []byte("super-secret-key")
    store = sessions.NewCookieStore(key)
)

func login(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "cookie-name")

    // Authentication goes here
    // ...

    // Set user as authenticated
    session.Values["authenticated"] = true
    session.Save(r, w)
}

func logout(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "cookie-name")

    // Revoke users authentication
    fmt.Fprintln(w, "session : %B", session.Values["authenticated"])
    session.Values["authenticated"] = false
    fmt.Fprintln(w, "session : %B", session.Values["authenticated"])
    session.Save(r, w)
    //sessions.Save(r, w)
    //store.Save(r, w, session)
}

func main() {
    http.HandleFunc("/secret", secret)
    http.HandleFunc("/login", login)
    http.HandleFunc("/logout", logout)

    http.ListenAndServe(":8080", nil)
}

输出:

> curl -s -I http://localhost:8080/login
HTTP/1.1 200 OK
Set-Cookie: cookie-name=MTU3NTUwODQ2MX...
> curl -s --cookie "cookie-name=MTU3NTUwODQ2MX..." http://localhost:8080/logout
session : true
session : false
> curl -s --cookie "cookie-name=MTU3NTUwODQ2MX..." http://localhost:8080/logout
session : true
session : false
> curl -s --cookie "cookie-name=MTU3NTUwODQ2MX..." http://localhost:8080/logout
session : true
session : false

【问题讨论】:

    标签: go session save gorilla


    【解决方案1】:

    这里有几个问题:

    • 在将会话保存到响应之前,您使用fmt.Fprintln(w, "session : %B", session.Values["authenticated"]) 编写响应正文。 我没有偷偷摸摸确保我的假设是正确的,但这使会话按预期工作。
    • cookie 未配置,尤其是 Path 属性。

    我还利用securecookies来生成一个适当长度的随机密钥。

    package main
    
    import (
        "encoding/gob"
        "fmt"
        "log"
        "net/http"
        "os"
        "time"
    
        "github.com/gorilla/securecookie"
        "github.com/gorilla/sessions"
    )
    
    var (
        // key must be 16, 24 or 32 bytes long (AES-128, AES-192 or AES-256)
        key   = securecookie.GenerateRandomKey(32)
        store = sessions.NewCookieStore(key)
        name  = "cookie-name1"
    )
    
    func login(w http.ResponseWriter, r *http.Request) {
        session, err := store.Get(r, name)
        log.Println(err)
    
        // Set user as authenticated
        fmt.Fprintf(os.Stdout, "session : %#v\n", session.Values)
        session.Values["authenticated"] = true
        session.Values["toto"] = ""
        fmt.Fprintf(os.Stdout, "session : %#v\n", session.Values)
        err = sessions.Save(r, w)
        log.Println(err)
    }
    
    func logout(w http.ResponseWriter, r *http.Request) {
        session, err := store.Get(r, name)
        log.Println(err)
    
        // Revoke users authentication
        fmt.Fprintf(os.Stdout, "session : %#v\n", session.Values)
        session.Values["authenticated"] = false
        session.Values["toto"] = time.Now().Format(time.RFC3339Nano)
        fmt.Fprintf(os.Stdout, "session : %#v\n", session.Values)
        err = sessions.Save(r, w)
        log.Println(err)
    }
    
    func main() {
        store.Options = &sessions.Options{
            Domain:   "localhost",
            Path:     "/",
            MaxAge:   86400 * 7,
            HttpOnly: true,
        }
    
        // http.HandleFunc("/secret", secret)
        http.HandleFunc("/login", login)
        http.HandleFunc("/logout", logout)
    
        http.ListenAndServe(":8080", nil)
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 2013-12-23
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      相关资源
      最近更新 更多