首頁 > 後端開發 > Golang > 為什麼我的 Golang 會話變數沒有保存在 Gorilla 會話中?

為什麼我的 Golang 會話變數沒有保存在 Gorilla 會話中?

Patricia Arquette
發布: 2024-11-03 20:41:29
原創
317 人瀏覽過

Why Are My Golang Session Variables Not Being Saved in Gorilla Sessions?

使用Gorilla 會話時,Golang 中的會話變數未儲存

問題描述

在Gorilla 會話實作中,不會跨請求維護會話變數。登入並設定會話變數後,新選項卡應該會維護會話,但使用者會被重新導向到登入頁面。

程式碼分析

<code class="go">sessionNew.Save(req, res)</code>
登入後複製

此程式碼遺失錯誤sessionNew.Save() 的處理。如果保存過程失敗,該錯誤將被忽略,從而導致意外行為。應更新為:

<code class="go">err := sessionNew.Save(req, res)
if err != nil {
    // Handle the error
}</code>
登入後複製

會話路徑

會話路徑設定為“/loginSession”,這將會話的範圍限制為僅該特定路徑。這可能會導致混亂,因為存取其他路由的使用者將無法存取該會話。為了確保會話在所有路由上可用,路徑應設定為“/”。

會話檢查

在 SessionHandler 中,會話檢查在提供靜態檔案後執行。這可能會導致問題,因為靜態文件是在驗證會話之前提供的。應在提供任何內容之前執行會話檢查。

經過改良的完整程式碼

<code class="go">package main

import (
    "crypto/md5"
    "encoding/hex"
    "fmt"
    "github.com/gocql/gocql"
    "github.com/gorilla/mux"
    "github.com/gorilla/sessions"
    "net/http"
    "time"
)

var store = sessions.NewCookieStore([]byte("something-very-secret"))

var router = mux.NewRouter()

func init() {

    store.Options = &sessions.Options{
        Domain:   "localhost",
        Path:     "/",
        MaxAge:   3600 * 8, // 8 hours
        HttpOnly: true,
    }
}

func main() {
    //session handling
    router.HandleFunc("/", sessionHandler)
    router.HandleFunc("/signIn", signInHandler)
    router.HandleFunc("/signUp", signUpHandler)
    router.HandleFunc("/logOut", logOutHandler)
    http.Handle("/", router)
    http.ListenAndServe(":8100", nil)
}

//handler for signIn
func signInHandler(res http.ResponseWriter, req *http.Request) {

    // Get the session
    session, err := store.Get(req, "loginSession")
    if err != nil {
        // Handle the error
    }

    // Set session values
    session.Values["email"] = req.FormValue("email")
    session.Values["name"] = req.FormValue("password")

    // Save the session
    err = session.Save(req, res)
    if err != nil {
        // Handle the error
    }
}

//handler for signUp
func signUpHandler(res http.ResponseWriter, req *http.Request) {
    // ...
}

//handler for logOut
func logOutHandler(res http.ResponseWriter, req *http.Request) {
    // Get the session
    session, err := store.Get(req, "loginSession")
    if err != nil {
        // Handle the error
    }

    // Save the session (with updated values)
    err = session.Save(req, res)
    if err != nil {
        // Handle the error
    }
}

//handler for Session
func sessionHandler(res http.ResponseWriter, req *http.Request) {
    // Get the session
    session, err := store.Get(req, "loginSession")
    if err != nil {
        // Handle the error
    }

    // Check if the session is valid
    if session.Values["email"] == nil {
        http.Redirect(res, req, "html/login.html", http.StatusFound)
    } else {
        http.Redirect(res, req, "html/home.html", http.StatusFound)
    }
}</code>
登入後複製

以上是為什麼我的 Golang 會話變數沒有保存在 Gorilla 會話中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板