|
|
@@ -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>
|