在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中文網其他相關文章!