Golang中如何获取保存到Cookies的Session-ID?

Golang中如何获取保存到Cookies的Session-ID? 我正在使用gorilla/session,需要获取即将保存到cookie中的会话生成令牌(ID),因为我想将该令牌也保存到数据库中。如果我打印HTTP响应即fmt.Println(w),我能够看到如下所示的会话ID:

&{0xc420204000 0xc42012e300 0xc420162840 0x118a4b0 false false false false 0xc420162280 {0xc4201a6460 map[] false false} map[Set-Cookie:[session=MTUyNzQ5MzA3M3xEdi1CQkFFQ180SUFBUkFCRUFBQUpmLUNBQUVHYzNSeWFXNW5EQW9BQ0hWelpYSnVZVzFsQm5OMGNtbHVad3dGQUFOaGMyUT18l1yx3yhYtbpiBRIagYseK80RSRC6warI07QxvmbuaDA=; Path=/; Expires=Wed, 27 Jun 2018 07:37:53 GMT; Max-Age=2592000]] true 0 -1 0 false false [] 0 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0] [0 0 0] 0xc4202140e0 0}

如何将此会话ID存储到变量中,以便后续使用。

func MyHandler(w http.ResponseWriter, r *http.Request) {
		// Get a session. We're ignoring the error resulted from decoding an
		// existing session: Get() always returns a session, even if empty.
		session, _ := store.Get(r, "session-name")
		// Set some session values.
		session.Values["foo"] = "bar"
		session.Values[42] = 43
		// Save it before we write to the response/return from the handler.
		session.Save(r, w)
	}

更多关于Golang中如何获取保存到Cookies的Session-ID?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

文档向我们展示了 sessions.Session 是:

type Session struct {
    // 会话ID,由存储生成。不应用于存储用户数据。
    ID  string
    // Values 包含会话的用户数据。
    Values  map[interface{}]interface{}
    Options *Options
    IsNew   bool
    // 包含已过滤或未导出的字段
}

session.ID 可获取会话ID。

更多关于Golang中如何获取保存到Cookies的Session-ID?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中使用gorilla/session时,可以通过session.ID直接获取会话ID。这个ID在调用Save方法后可用,因为会话ID是在保存过程中生成的。

以下是修改后的代码示例:

func MyHandler(w http.ResponseWriter, r *http.Request) {
    // 获取会话
    session, _ := store.Get(r, "session-name")
    
    // 设置会话值
    session.Values["foo"] = "bar"
    session.Values[42] = 43
    
    // 保存会话
    err := session.Save(r, w)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    
    // 获取会话ID
    sessionID := session.ID
    fmt.Printf("Session ID: %s\n", sessionID)
    
    // 将sessionID保存到数据库
    // 例如:db.SaveSession(sessionID, session.Values)
}

如果你需要在保存之前就获取会话ID,可以使用以下方法:

func MyHandler(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "session-name")
    session.Values["foo"] = "bar"
    session.Values[42] = 43
    
    // 强制生成新的会话ID(如果需要)
    if session.IsNew {
        // 生成新的会话ID
    }
    
    // 保存前获取ID(如果已存在)
    if session.ID != "" {
        fmt.Printf("Existing Session ID: %s\n", session.ID)
    }
    
    err := session.Save(r, w)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    
    // 保存后获取最终的会话ID
    finalSessionID := session.ID
    fmt.Printf("Final Session ID: %s\n", finalSessionID)
    
    // 保存到数据库
    // db.SaveSession(finalSessionID, session.Values)
}

注意:会话ID在调用Save方法后才是最终确定的,特别是对于新创建的会话。对于已存在的会话,ID在调用Get方法后就可用了。

回到顶部