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
Lepaskan: 2024-11-03 20:41:29
asal
318 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan