test/backend/internal/middleware/idle.go
2025-11-21 16:03:52 +08:00

48 lines
870 B
Go

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()
}
}