2017-07-19 78 views
2

我有一個關於會話的一般問題。當談到這個問題時,我的經驗並不是很豐富。我試過了:gorilla /會話在服務器重啓之間持續存在?

NewRediStore (gopkg.in/boj/redistore.v1) 
NewCookieStore 
NewFileSystemStore 

我的印象是,會話可能持續服務器重新啓動,因此需要'商店'。當我的golang後端正在運行時,我可以設置新會話併爲多個用戶/瀏覽器檢索它們。那裏沒有問題。

當我重新啓動服務器時,我注意到所有會話訪問結果都是session.IsNew == true。 在Redis中,我可以看到重新啓動後的所有會話密鑰,甚至驗證了會話結果中檢索到正確的ID,但IsNew仍然設置。

我想直覺地說,這是有道理的,因爲內存中必須有一些地圖導致IsNew的設置,但我認爲如果商店中的cookie密鑰有任何命中,則不應設置IsNew。我瘋了嗎?有什麼容易的,我做錯了嗎?這是對如何使用會話的基本誤解? 如果我需要包含代碼或其他詳細信息,請讓我知道。

回答

1

我會假設你有同樣的想法,瀏覽源代碼,它看起來應該像你所描述的那樣工作。您可以嘗試調試並逐步完成調試,特別是您正在使用的商店的New方法(例如FilesystemStore.NewRediStore.New)。據該消息來源稱,如果該方法成功讀取cookie並在商店中找到會話,它應該設置IsNew = false

另請注意,僅檢查會話ID並不是驗證此行爲的好方法。如果您查看源代碼,它將解碼來自Cookie的會話ID,然後會嘗試在後備存儲中查看該會話ID。如果查找失敗,則會話ID將匹配,但IsNew將爲true,並且會話中不會有任何值。確保你在會話中設置了一些值並檢查該值,而不是會話ID。 CookieStore的行爲不同,因爲它將會話數據存儲在cookie本身中。

+1

有趣。挖到redistore,我在代碼中看到[this](https://github.com/boj/redistore/blob/v1.2/redistore.go#L242),並決定在那裏打印一些東西。 'ok == true' **和**'err ==「gob:name未註冊接口:」gitlab.com/droneprime/spectre.host/server/internal/handlers.User「」'這看起來很奇怪錯誤代碼中的這一點?這似乎應該在我的代碼? – droneprime

+1

我解決了我的問題。當你放入東西時,你不僅需要用'encoding/gob'註冊,而且當你嘗試訪問數據時也要註冊。謝謝你鼓勵我在圖書館代碼中捅捅。我將在未來做到這一點:) – droneprime

相關問題