package middleware import ( "sync" "time" "github.com/gin-gonic/gin" "soda-api/backend/internal/utils" ) type IdleManager struct { mu sync.Mutex lastSeen map[string]time.Time timeout time.Duration } func NewIdleManager(timeout time.Duration) *IdleManager { return &IdleManager{ lastSeen: make(map[string]time.Time), timeout: timeout, } } func (m *IdleManager) Middleware() gin.HandlerFunc { return func(c *gin.Context) { token, _ := c.Get("tokenString") tokenStr, _ := token.(string) if tokenStr == "" { c.Next() return } m.mu.Lock() last, ok := m.lastSeen[tokenStr] now := time.Now() if ok && now.Sub(last) > m.timeout { delete(m.lastSeen, tokenStr) m.mu.Unlock() utils.JSONError(c, 401, "登录超时,请重新登录") c.Abort() return } m.lastSeen[tokenStr] = now m.mu.Unlock() c.Next() } }