gpt4 book ai didi

当用户在 3 分钟内未向 Go Web 服务器发送数据时,Go session 超时

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:07 26 4
gpt4 key购买 nike

我将使用 Go 构建 Web 服务器。现在我想将 session ID 返回给用户使用用户名和密码登录。而且我认为我可以接受登录程序。用户每次要发布数据时都会使用 session ID。但是,用户登录后,如果用户在3分钟内没有发送数据,我会尝试销毁session,使session id不再有效。

那么,当用户在 3 分钟内未发布数据时,如何使 session 过期。 (我将使用 beego,beego 有 session 超时,但它确实提到它会超时取决于发布数据间隔)

谢谢。

最佳答案

您可以设置上次使用 session 的时间。

假设 cookie 存储创建为

Store := sessions.NewCookieStore("some-32-bit-long-secret")

然后您可以将当前时间存储到 session 中:

// SetTime resets the activity time to the current time
func SetTime(w http.ResponseWriter, r *http.Request) error {
ssn, err := Store.Get(r, cookieKey)
if err != nil {
return err
}

b, err := json.Marshal(time.Now())
if err != nil {
return err
}

ssn.Values[timeKey] = b
return ssn.Save(r, w)
}

然后可以在 session 中找到最后一次事件时间:

// GetTime retrieves the last activity time from the session
func GetTime(ssn *sessions.Session) (*time.Time, error) {
v := ssn.Values[timeKey]
tm := &time.Time{}
if b, ok := v.([]byte); ok {
err := json.Unmarshal(b, tm)
if err == nil {
return tm, nil
}
return nil, err
}

return nil, errors.New("Time missing")
}

接下来使用一个中间件函数来测试 session 是否应该变为无效;如果不然后重置事件时间:

func (cfg *Config) Timer(next http.HandlerFunc, d time.Duration) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ssn, err := cfg.Store.Get(r, cookieKey)
if err != nil {
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}

if tm, err := GetTime(ssn); err == nil {
if time.Since(*tm) > d {
// invalidate user account in some way; it is assumed that the user
// info is stored in the session with the key value "userKey"
session.Values[userKey] = ""
session.Save(r, w) // should test for error
// do something for a signed off user, e.g.:
SignIn(w, r)
return
}

if err = SetTime(w, r); err == nil {
next(w, r)
return
}
}

http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
}
}

路由中可以使用中间件:

    ...
r := mux.NewRouter()
...
r.HandleFunc("/path", Timer(SomeHFunc, 3*time.Minute))
...

关于当用户在 3 分钟内未向 Go Web 服务器发送数据时,Go session 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25260395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com