From c95565e1dd78d61af8eb653d1753fae7d589191b Mon Sep 17 00:00:00 2001 From: luke Date: Thu, 5 Jun 2025 15:57:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E5=9F=BA=E4=BA=8EAuthentification?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E6=9B=BF=E6=8D=A2=E6=88=90=E5=9F=BA=E4=BA=8E?= =?UTF-8?q?Cookie=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../north/controller/LoginController.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/doc/parser/infrastructure/north/controller/LoginController.java b/src/main/java/com/doc/parser/infrastructure/north/controller/LoginController.java index 9ace3da..4dbdb14 100644 --- a/src/main/java/com/doc/parser/infrastructure/north/controller/LoginController.java +++ b/src/main/java/com/doc/parser/infrastructure/north/controller/LoginController.java @@ -3,6 +3,7 @@ package com.doc.parser.infrastructure.north.controller; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -28,7 +29,7 @@ public class LoginController { private static final long TOKEN_EXPIRE_MS = 24 * 60 * 60 * 1000L; // 24 小时 @PostMapping("/login") - public ResponseEntity login(@RequestBody Map body) { + public ResponseEntity login(@RequestBody Map body, HttpServletResponse response) { String username = body.getOrDefault("username", "").trim(); String password = body.getOrDefault("password", "").trim(); @@ -36,19 +37,29 @@ public class LoginController { return ResponseEntity.status(401).body(Map.of("message", "用户名或密码错误")); } - String token = UUID.randomUUID().toString(); - token = token.replace("-", ""); + String token = UUID.randomUUID().toString().replace("-", ""); tokenStore.put(token, System.currentTimeMillis()); userMap.put(token, username); + javax.servlet.http.Cookie cookie = new javax.servlet.http.Cookie("auth_token", token); + cookie.setPath("/"); + cookie.setHttpOnly(false); // 建议生产环境为 true,这里为兼容前端 JS 读写可设为 false + cookie.setMaxAge((int)(TOKEN_EXPIRE_MS / 1000)); + response.addCookie(cookie); + return ResponseEntity.ok(Map.of( "token", token, "username", username )); } + @GetMapping("/check") - public ResponseEntity check(@RequestHeader("Authorization") String token) { + public ResponseEntity check( + @CookieValue(value = "auth_token", required = false) String cookieToken, + @RequestHeader(value = "Authorization", required = false) String headerToken + ) { + String token = headerToken != null ? headerToken : cookieToken; if (isValidToken(token)) { Map result = new HashMap<>(); result.put("code", 0); @@ -61,6 +72,7 @@ public class LoginController { return ResponseEntity.status(401).body(result); } + public static boolean isValidToken(String token) { if (token == null || !tokenStore.containsKey(token)) return false; long loginAt = tokenStore.get(token);