ホームページ > バックエンド開発 > Golang > Golang セッション変数が Gorilla セッションに保存されないのはなぜですか?

Golang セッション変数が Gorilla セッションに保存されないのはなぜですか?

Patricia Arquette
リリース: 2024-11-03 20:41:29
オリジナル
318 人が閲覧しました

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート