2014-09-28 3 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 처리기의 조각입니다. 그러나 relavent 부품이 게시되고 store.Get()에 대한 두 번째 호출은 기존 세션을 반환하지 않고 새로운 세션을 반환합니다. 따라서이 코드가있는 핸들러가 실행될 때 로그 문이 콘솔에 인쇄됩니다.

내가 만든이 세션에서 새 세션이 생기는 이유는 무엇입니까? 실제 시즌 값이 ResponseWriter에 기록되는 쿠키, 복사 내부에 저장되기 때문에

+0

어떤 가게를 사용하고 있습니까? – OneOfOne

+0

다른 코드는 없습니다. 처음으로 코드를 잘못 게시했습니다. 같은 질문, 다른 문제. – moesef

+0

메신저 쿠키를 사용하여 – moesef

답변

2

나는이 질문에 이미 대답 한 것처럼 느낍니다. 이 pkg을 오용하고 있습니다. 배후에서 context 패키지는 요청에 대한 상태를 저장하는 데 사용되며, 불완전한 새로운 http.Request를 작성하면 컨텍스트 패키지는 세션 정보가없는 빈 상태를 반환합니다.

나는이 얘기를보고이 code을 확인하십시오.

+0

도움을 주셔서 감사합니다. 불완전한 응답은 내가 아직도 알아 내려고 노력하고있는 어떤 이유로 작동하지 않습니다. – moesef

1

다음 코드는 작동하지 않습니다

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을 확인하십시오.

새 쿠키에 액세스하려면 페이지를 새로 고침해야합니다.

0

나는 이것이 고릴라/세션과 관련이 없다고 생각하지만, 당신이 그 요청 구조체를 어떻게 구성하고 있는지 생각하지 않습니다. 당신이 session.Save(r, w)를 호출 할 때

w.Header() 지금 같은지도가 포함됩니다 다음

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

당신은 Cookie 헤더 Set-Cookie 헤더 것으로 교체해야합니다 - 그렇지 않으면 고릴라/세션이 어떤 쿠키를 볼 수 없습니다 요청을 받았고 요청에 세션 쿠키가 없다고 가정합니다.

하지만 @OneOfOne에서 언급 한 것처럼 보통 http.Redirect으로 전화를 걸어 브라우저에 Set-Cookie - Cookie을 대신 지정하십시오.