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 ハンドラーの抜粋です。しかし、関連する部分が投稿され、2 番目の呼び出しstore.Get()は既存のセッションではなく、新しいセッションを返します。したがって、このコードが含まれるハンドラが実行されると、ログ ステートメントがコンソールに出力されます。

この場合、すでに作成して保存したセッションではなく、新しいセッションを取得するのはなぜですか?

4

3 に答える 3

1

次のコードは、実際の季節の値が に書き込まれる Cookie 内に保存されているため、機能しません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 にアクセスするには、ページをリロードする必要があります。

于 2014-09-28T03:35:44.083 に答える
0

これはゴリラ/セッションとは何の関係もないと思いますが、そのリクエスト構造をどのように構築しているかに関係しています。

を呼び出すとsession.Save(r, w)w.Header()次のようなマップが含まれるようになります。

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

Set-Cookieそのヘッダーをヘッダーに置き換える必要がありCookieます。そうしないと、ゴリラ/セッションはリクエストで Cookie を認識せず、リクエストにセッション Cookie がないと見なされます。

しかし、ええ、@OneOfOneが述べたように、通常は電話http.RedirectしてブラウザにそれをさせるだけですSet-Cookie-Cookieあなたの代わりです。

于 2015-11-07T23:19:49.067 に答える