From e244bccb5c6fd08065e68bf58f9735e170196175 Mon Sep 17 00:00:00 2001 From: Victor_Jay Date: Sun, 31 May 2026 00:29:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E7=AB=AF=E7=99=BB=E5=BD=95=E4=BC=9A=E8=AF=9D=E5=8E=BB=E9=87=8D?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 去重会合并标准模式/无痕模式的独立会话,不符合预期 - 防重复提交由前端按钮禁用保证即可,服务端无需干预 --- internal/session/manager.go | 44 +++++-------------------------------- 1 file changed, 5 insertions(+), 39 deletions(-) diff --git a/internal/session/manager.go b/internal/session/manager.go index 7667d42..4959a07 100644 --- a/internal/session/manager.go +++ b/internal/session/manager.go @@ -2,7 +2,6 @@ package session import ( "log" - "sync" "time" "metazone.cc/metalab/internal/config" @@ -16,46 +15,18 @@ type userStore interface { // Manager 会话管理器:创建、验证、销毁、续期 type Manager struct { - store Store - userRepo userStore - cfg *config.Config - mu sync.Mutex - recentLogin map[uint]*loginEntry // uid → 最近一次登录记录(防重复创建) -} - -type loginEntry struct { - sid string - ip string - userAgent string - createdAt time.Time + store Store + userRepo userStore + cfg *config.Config } // NewManager 构造函数 func NewManager(store Store, userRepo userStore, cfg *config.Config) *Manager { - return &Manager{ - store: store, - userRepo: userRepo, - cfg: cfg, - recentLogin: make(map[uint]*loginEntry), - } + return &Manager{store: store, userRepo: userRepo, cfg: cfg} } -// Create 创建会话并写入存储(同用户+同 IP+同 UA 在 10 秒内重复调用时返回已有会话,防重复创建) +// Create 创建会话并写入存储 func (m *Manager) Create(user *model.User, rememberMe bool, ip, userAgent string) (string, error) { - m.mu.Lock() - // 幂等检查:同用户+同 IP+同 UA,10 秒内不重复创建 - if entry, ok := m.recentLogin[user.ID]; ok { - if entry.ip == ip && entry.userAgent == userAgent && time.Since(entry.createdAt) < 10*time.Second { - // 验证旧会话仍然有效 - if s, _ := m.store.Get(entry.sid); s != nil { - m.mu.Unlock() - log.Printf("[SessionManager] Create dedup uid=%d reuse sid=%s", user.ID, entry.sid[:16]+"...") - return entry.sid, nil - } - } - } - m.mu.Unlock() - sid, err := NewID() if err != nil { return "", err @@ -76,11 +47,6 @@ func (m *Manager) Create(user *model.User, rememberMe bool, ip, userAgent string if err := m.store.Set(s); err != nil { return "", err } - - m.mu.Lock() - m.recentLogin[user.ID] = &loginEntry{sid: sid, ip: ip, userAgent: userAgent, createdAt: now} - m.mu.Unlock() - log.Printf("[SessionManager] Created sid=%s uid=%d rememberMe=%v ip=%s", sid[:16]+"...", user.ID, rememberMe, ip) return sid, nil }