48 lines
870 B
Go
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()
|
|
}
|
|
}
|