Просмотр исходного кода

feat: 添加全局 JWT Token 自动刷新机制,避免 20 分钟过期后 401

kinglee 1 неделя назад
Родитель
Сommit
93181b3c09
1 измененных файлов с 58 добавлено и 0 удалено
  1. 58 0
      app/templates/base.html

+ 58 - 0
app/templates/base.html

@@ -19,5 +19,63 @@
 <body class="min-h-screen flex flex-col">
     {% block content %}{% endblock %}
     {% block scripts %}{% endblock %}
+
+    <!-- 全局 Token 自动刷新 -->
+    <script>
+    (function () {
+        var refreshing = false;
+        var pendingRequests = [];
+
+        $.ajaxSetup({
+            beforeSend: function (xhr) {
+                var token = localStorage.getItem('token') || localStorage.getItem('jwt_token');
+                if (token) {
+                    xhr.setRequestHeader('Authorization', 'Bearer ' + token);
+                }
+            }
+        });
+
+        $(document).ajaxError(function (event, jqXHR, settings) {
+            if (jqXHR.status === 401 && !refreshing) {
+                var rt = localStorage.getItem('refresh_token');
+                if (!rt) {
+                    window.location.href = '/login';
+                    return;
+                }
+
+                refreshing = true;
+                // 暂停后续请求重试队列
+                pendingRequests.push({ settings: settings });
+
+                $.ajax({
+                    url: '/api/v1/auth/refresh',
+                    method: 'POST',
+                    contentType: 'application/json',
+                    data: JSON.stringify({ refresh_token: rt }),
+                    success: function (resp) {
+                        if (resp.code === '000000') {
+                            localStorage.setItem('token', resp.data.access_token);
+                            localStorage.setItem('refresh_token', resp.data.refresh_token);
+                            // 重试所有挂起的请求
+                            pendingRequests.forEach(function (p) {
+                                $.ajax(p.settings);
+                            });
+                        } else {
+                            window.location.href = '/login';
+                        }
+                    },
+                    error: function () {
+                        window.location.href = '/login';
+                    },
+                    complete: function () {
+                        refreshing = false;
+                        pendingRequests = [];
+                    }
+                });
+                return false;
+            }
+        });
+    })();
+    </script>
 </body>
 </html>