From 10b88a7ff17caf92f3d4e8a550c1085a70c2517a Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 28 五月 2026 17:43:26 +0800
Subject: [PATCH] Merge dev_New_pro into dev_山西_晋和园_pro
---
src/main/java/com/ruoyi/ai/context/AiSessionUserContext.java | 65 ++++++++++++++++++++++++++++++++
1 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/ruoyi/ai/context/AiSessionUserContext.java b/src/main/java/com/ruoyi/ai/context/AiSessionUserContext.java
new file mode 100644
index 0000000..5251561
--- /dev/null
+++ b/src/main/java/com/ruoyi/ai/context/AiSessionUserContext.java
@@ -0,0 +1,65 @@
+package com.ruoyi.ai.context;
+
+import com.ruoyi.framework.security.LoginUser;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+public class AiSessionUserContext {
+
+ private final Map<String, LoginUser> loginUserByMemoryId = new ConcurrentHashMap<>();
+ private final Map<String, Instant> lastAccessTimeByMemoryId = new ConcurrentHashMap<>();
+ private static final Duration SESSION_TIMEOUT = Duration.ofHours(24);
+
+ public void bind(String memoryId, LoginUser loginUser) {
+ if (!StringUtils.hasText(memoryId) || loginUser == null) {
+ return;
+ }
+ loginUserByMemoryId.put(memoryId, loginUser);
+ lastAccessTimeByMemoryId.put(memoryId, Instant.now());
+ }
+
+ public LoginUser get(String memoryId) {
+ if (!StringUtils.hasText(memoryId)) {
+ return null;
+ }
+ if (isExpired(memoryId)) {
+ remove(memoryId);
+ return null;
+ }
+ lastAccessTimeByMemoryId.put(memoryId, Instant.now());
+ return loginUserByMemoryId.get(memoryId);
+ }
+
+ public void remove(String memoryId) {
+ if (!StringUtils.hasText(memoryId)) {
+ return;
+ }
+ loginUserByMemoryId.remove(memoryId);
+ lastAccessTimeByMemoryId.remove(memoryId);
+ }
+
+ public void cleanExpiredSessions() {
+ Instant now = Instant.now();
+ lastAccessTimeByMemoryId.entrySet().removeIf(entry -> {
+ boolean expired = Duration.between(entry.getValue(), now).compareTo(SESSION_TIMEOUT) > 0;
+ if (expired) {
+ loginUserByMemoryId.remove(entry.getKey());
+ }
+ return expired;
+ });
+ }
+
+ private boolean isExpired(String memoryId) {
+ Instant lastAccess = lastAccessTimeByMemoryId.get(memoryId);
+ if (lastAccess == null) {
+ return true;
+ }
+ return Duration.between(lastAccess, Instant.now()).compareTo(SESSION_TIMEOUT) > 0;
+ }
+}
--
Gitblit v1.9.3