我将使用Go来构建Web服务器。现在我希望将一个会话ID返回给用户 使用用户名和密码登录。我认为我对登录程序没问题。用户每次想要发布数据时都会使用会话ID。但是,在用户登录后,如果用户未在3分钟内发送数据,我将尝试销毁会话ID不再有效的会话。
那么当用户不在3分钟内发布数据时,如何使会话过期。 (我将使用beego,beego会话超时,但确实提到它将超时取决于后期数据间隔)
感谢。
答案 0 :(得分:0)
您可以设置上次使用会话的时间。
假设将cookie存储创建为
Store := sessions.NewCookieStore("some-32-bit-long-secret")
然后您可以将当前时间存储到会话中:
// 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)
}
活动的最后时间可以在会话中找到:
// 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")
}
接下来使用中间件功能来测试会话是否应该变为无效;如果不 然后重置活动时间:
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))
...