2014-09-28 64 views
2

我想設置大猩猩會話,然後再次檢索該值。我做了以下測試。獲取現有的大猩猩會話

//create session and store in http Cookies 
session, err := store.Get(req, "session") 
if err != nil { 
    errCode = http.StatusInternalServerError 
    return 
} 

//save a value 
session.Values["user_id"] = userTuple.UserId 
err = session.Save(req, w) 
if err != nil { 
    errCode = http.StatusInternalServerError 
    return 
} 

//try to get the same session that was just created 
nr := http.Request{Header: w.Header()} 
session, err = store.Get(&nr, "session") 
if err != nil { 
    errCode = http.StatusInternalServerError 
    return 
} else if session.IsNew { 
    log.Println("New session created instead of old one.") 
} 

這是一個從更大的HTTP處理程序中抽出的代碼片段。但相關部分已發佈,而第二次致電store.Get()未返回現有會話,而是返回一個全新的會話。因此,執行此代碼所在的處理程序時,會將日誌語句打印到控制檯。

爲什麼我在這種情況下獲得新會話而不是我已經創建和保存的會話?

+0

您使用的是什麼類型的商店? – OneOfOne 2014-09-28 03:31:13

+0

不,這是不同的代碼。我第一次發佈錯誤的代碼。同樣的問題,不同的問題。 – moesef 2014-09-28 03:31:22

+0

我正在使用CookieStore – moesef 2014-09-28 03:31:43

回答

2

我覺得我已經回答了這個問題。你在濫用這個pkg。在後臺,context包通過創建新的不完整的http.Request來存儲請求的狀態,上下文包返回一個沒有會話信息的空狀態。

看看這個code看看我在說什麼。

+0

感謝您的幫助。由於某些原因,我仍然試圖弄清楚,不完整的響應不起作用。 – moesef 2014-09-28 04:19:56

1

下面的代碼將無法工作,因爲實際的季節值保存寫入到ResponseWriter餅乾,複製裏面:

nr := http.Request{Header: w.Header()} 
session, err = store.Get(&nr, "session") 

用於保存代碼https://github.com/gorilla/sessions/blob/master/store.go#L101

它存儲的季節由於一些奇怪的原因,請求指針的ID,檢查https://github.com/gorilla/context/blob/master/context.go#L31

您必須重新加載頁面才能訪問新的cookie。

0

我不認爲這與大猩猩/會話有任何關係,而是與您如何構建請求結構有關。

當你調用session.Save(r, w)w.Header()現在將包含圖如下所示:

map[string][]string{ 
    // ... 
    "Set-Cookie": []string{/* ... */} 
    // ... 
} 

您應該替換Set-Cookie頭與Cookie頭 - 否則,大猩猩/會話將不會看到任何cookie請求,並且會假定該請求沒有會話cookie。

但是,就像@OneOfOne提到的那樣,你通常只需撥打http.Redirect並讓瀏覽器爲你替換Set-Cookie - Cookie