2014-02-16 25 views
4

我正在嘗試使用用戶登錄創建一個簡單的Web應用程序。Golang Gorilla/session

我發現這裏的另一個帖子此功能。

func initSession(r *http.Request) *sessions.Session { 
    session, _ := store.Get(r, "mBoxStore") 
    if session.IsNew { 
     session.Options.Domain = "localhost" 
     session.Options.MaxAge = 10 
     session.Options.HttpOnly = false 
     session.Options.Secure = false 
     log.Println("Create New Session (cookie)") 
    } else { 
     log.Println("Use Old Session (old cookie)") 
    } 
    return session 
} 

Cookie在10 seconds之後過期,但當我重新加載頁面後, 1 Minute 它使用舊的(過期的)cookie。

在我的瀏覽器(Firefox),我看到右邊的cookie的過期日期。

我覺得應該有一個新的cookie創建一個新的會話,或它是錯誤的?

任何提示?

+1

您最好在應用程序啓動時爲每個商店設置選項。然後在你的處理程序中使用'session.Get'(並檢查錯誤)。 '會議'文件覆蓋了它:http://www.gorillatoolkit.org/pkg/sessions – elithrar

+0

感謝您的答案。問題不是代碼...它適用於我...我可以保存並從會話中讀取數據... 但它忽略了從cookie中過期的日期。 它始終使用「舊」Cookie。 – user3033143

回答

4

您看到的原因Use Old Session (old cookie)是因爲會話選項爲而僅在第一次創建cookie時設置了。每次到期前(isNew == falseOptions沒有被設置的,默認是覆蓋與您在創建會話設置訪問該cookie。默認MaxAge86400 * 30(一個月)。

您可以驗證這一點:

  1. 清除所有cookies的網站(即本地主機)
  2. 在瀏覽器
  3. 檢查在新創建的cookie到期日養大一個路徑 - 你會看到它現在+ 10秒
  4. 等10秒鐘。
  5. 刷新頁面 - 你的日誌應該確認它是一個新的cookie。
  6. 現在在cookie過期之前刷新頁面(即在10秒內)
  7. 您將看到到期日期已過期,現在爲+ 1個月(默認值)。

這就是爲什麼我建議設置你的會話選項一次,在應用程序啓動。如果您爲了身份驗證安全目的而設置更短的Cookie存活時間,並且在這些情況下使用不同的會話名稱(即_csrf_token到期時間爲4小時),則這種情況只會有所偏差。

的代碼片段你使用是不是真的理想無論是作爲它完全忽略嘗試檢索會話時遇到的任何錯誤。如果您的底層會話存儲已損壞,並且/或者用戶禁用了Cookie,則可能會遇到錯誤。

+0

感謝您的幫助:) 現在我看到了問題。 我沒有看到新的cookie中的過期「月」,我只看創建時間。 – user3033143

+2

如果不清楚(起初我不清楚答案是什麼時,我建議在應用程序啓動時設置一次會話選項*),商店有一個'.Options',就像'session .Options'。因此:'var sessionStore = sessions.NewCookieStore(...)'然後'sessionStore.Options =&sessions.Options {MaxAge:...}'等等 – eduncan911