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.
<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 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 "/".
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.
<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!