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
Libérer: 2024-11-03 20:41:29
original
318 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal