From cd43768bafecd7c6d2cec1b1dabc9fda0d15fe7e Mon Sep 17 00:00:00 2001 From: ikmkj <1@qq,com> Date: Thu, 31 Jul 2025 19:39:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(security):=20=E6=B7=BB=E5=8A=A0=20Token=20?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 CommonApi.js 中添加 validateToken 函数,用于验证 Token 有效性 - 在 HomePage.vue 中集成 Token 验证功能,导出前验证登录状态- 在 UserController.java 中添加 validateToken 接口,用于后端验证 Token --- .../bijihoudaun/controller/UserController.java | 7 ++++++- biji-qianduan/src/api/CommonApi.js | 3 +++ biji-qianduan/src/components/HomePage.vue | 14 ++++++++++++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/UserController.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/UserController.java index 51f885e..75ea2ad 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/UserController.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/controller/UserController.java @@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; @@ -57,6 +58,10 @@ public class UserController { return R.success("删除成功"); } - + @Operation(summary = "验证Token有效性") + @PostMapping("/validate-token") + public R validateToken() { + return R.success("Token is valid"); + } } diff --git a/biji-qianduan/src/api/CommonApi.js b/biji-qianduan/src/api/CommonApi.js index bd3a719..cf4d372 100644 --- a/biji-qianduan/src/api/CommonApi.js +++ b/biji-qianduan/src/api/CommonApi.js @@ -127,3 +127,6 @@ export const permanentlyDeleteItem = (id) => axiosApi.delete(`/api/trash/permane // 清空回收站 export const cleanTrash = () => axiosApi.delete('/api/trash/clean'); + +// 验证Token +export const validateToken = () => axiosApi.post('/api/user/validate-token'); diff --git a/biji-qianduan/src/components/HomePage.vue b/biji-qianduan/src/components/HomePage.vue index 8dc27cf..9465c02 100644 --- a/biji-qianduan/src/components/HomePage.vue +++ b/biji-qianduan/src/components/HomePage.vue @@ -50,7 +50,7 @@ 返回 保存 {{ saveStatus }} - + 导出 @@ -225,7 +225,8 @@ import { updateGroupingName, updateMarkdownTitle, deleteGrouping as apiDeleteGrouping, - getRecentFiles + getRecentFiles, + validateToken } from '@/api/CommonApi.js' import { Plus, Fold, Expand, Folder, Document, Search, Edit, Delete, ArrowDown, Clock } from "@element-plus/icons-vue"; import { useUserStore } from '../stores/user'; @@ -746,6 +747,15 @@ const sanitizeFilename = (name) => name.replace(/[<>:"/\\|?*]/g, '_').trim() || const handleExport = async (format) => { if (!selectedFile.value || showExportLoading.value) return; + try { + await validateToken(); + } catch (error) { + ElMessage.error('登录已过期,请重新登录'); + userStore.logout(); + router.push('/login'); + return; + } + const title = sanitizeFilename(selectedFile.value.title); const content = selectedFile.value.content; const previewElement = document.querySelector('.markdown-preview');