Maison >développement back-end >Golang >Pourquoi mes variables de session Golang ne sont-elles pas enregistrées dans les sessions Gorilla ?

Pourquoi mes variables de session Golang ne sont-elles pas enregistrées dans les sessions Gorilla ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-03 20:41:29321parcourir

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

Variables de session dans Golang non enregistrées lors de l'utilisation de sessions Gorilla

Description du problème

Dans une implémentation de sessions Gorilla, les variables de session ne sont pas conservées entre les requêtes . Après vous être connecté et avoir défini la variable de session, un nouvel onglet devrait maintenir la session, mais à la place, les utilisateurs sont redirigés vers la page de connexion.

Analyse du code

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

Ce code manque d'erreur gestion de sessionNew.Save(). Si le processus de sauvegarde échoue, l'erreur sera ignorée, entraînant un comportement inattendu. Il doit être mis à jour vers :

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

Chemin de la session

Le chemin de la session est défini sur "/loginSession", ce qui limite la portée de la session à ce chemin spécifique uniquement. Cela peut prêter à confusion car les utilisateurs visitant d'autres itinéraires n'auront pas accès à la session. Pour garantir que la session est disponible sur toutes les routes, le chemin doit être défini sur "/".

Vérification de session

Dans SessionHandler, la vérification de session est effectuée après avoir servi des fichiers statiques. Cela peut entraîner des problèmes car les fichiers statiques sont servis avant la validation de la session. La vérification de session doit être effectuée avant de diffuser un contenu.

Code complet avec améliorations

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn