Rumah >pembangunan bahagian belakang >Golang >Mengapa Pembolehubah Sesi Golang Saya Tidak Disimpan dalam Sesi Gorilla?

Mengapa Pembolehubah Sesi Golang Saya Tidak Disimpan dalam Sesi Gorilla?

Patricia Arquette
Patricia Arquetteasal
2024-11-03 20:41:29319semak imbas

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

Pembolehubah Sesi di Golang Tidak Disimpan Semasa Menggunakan Sesi Gorila

Penerangan Isu

Dalam pelaksanaan sesi Gorila, pembolehubah sesi tidak dikekalkan merentas permintaan . Selepas log masuk dan menetapkan pembolehubah sesi, tab baharu harus mengekalkan sesi, tetapi sebaliknya, pengguna dialihkan ke halaman log masuk.

Analisis Kod

<code class="go">sessionNew.Save(req, res)</code>

Kod ini tiada ralat pengendalian untuk sessionNew.Save(). Jika proses menyimpan gagal, ralat akan diabaikan, membawa kepada tingkah laku yang tidak dijangka. Ia harus dikemas kini kepada:

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

Laluan Sesi

Laluan sesi ditetapkan kepada "/loginSession", yang mengehadkan skop sesi kepada laluan khusus itu sahaja. Ini boleh menyebabkan kekeliruan kerana pengguna yang melawat laluan lain tidak akan mempunyai akses kepada sesi tersebut. Untuk memastikan sesi tersedia di semua laluan, laluan hendaklah ditetapkan kepada "/".

Semakan Sesi

Dalam SessionHandler, semakan sesi dilakukan selepas menyiarkan fail statik. Ini boleh menyebabkan masalah kerana fail statik disampaikan sebelum sesi disahkan. Semakan sesi perlu dilakukan sebelum menyampaikan sebarang kandungan.

Lengkapkan Kod dengan Penambahbaikan

<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>

Atas ialah kandungan terperinci Mengapa Pembolehubah Sesi Golang Saya Tidak Disimpan dalam Sesi Gorilla?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn