You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Astro前端集成JWT认证:对接Spring Boot后端实现登录鉴权功能

Astro + Spring Boot JWT认证实现方案

一、封装全局请求工具(统一处理Token携带与401拦截)

为避免重复编写请求头和错误处理逻辑,封装一个全局请求函数,自动携带Token并拦截401未授权响应:

// src/utils/api.js
export async function apiRequest(url, options = {}) {
  // 从本地存储获取Token
  const token = localStorage.getItem('jwt_token');
  
  // 构建请求头,默认携带Content-Type,有Token则加Authorization
  const headers = {
    'Content-Type': 'application/json',
    ...options.headers,
  };
  if (token) {
    headers['Authorization'] = `Bearer ${token}`;
  }

  try {
    const response = await fetch(url, {
      ...options,
      headers,
    });

    // 拦截401响应:删除Token并跳转登录页
    if (response.status === 401) {
      localStorage.removeItem('jwt_token');
      window.location.href = '/login';
      throw new Error('未授权,请重新登录');
    }

    return response;
  } catch (error) {
    console.error('请求出错:', error);
    throw error;
  }
}

使用示例:替代原生fetch调用后端接口

import { apiRequest } from '../utils/api.js';

async function getUserInfo() {
  const response = await apiRequest('/api/user/info');
  const userData = await response.json();
  // 处理用户数据
}

二、登录页面实现(获取并存储Token)

创建登录页面,处理表单提交,从后端获取Token并存入本地存储:

---
// src/pages/login.astro
---
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <title>登录</title>
</head>
<body>
  <div class="login-form">
    <h2>登录</h2>
    <input type="text" id="username" placeholder="用户名" />
    <input type="password" id="password" placeholder="密码" />
    <button id="loginBtn">登录</button>
  </div>

  <script is:inline>
    // 客户端登录逻辑
    document.getElementById('loginBtn').addEventListener('click', async () => {
      const username = document.getElementById('username').value;
      const password = document.getElementById('password').value;

      try {
        // 调用Spring Boot登录接口
        const response = await fetch('/api/auth/login', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ username, password }),
        });

        if (response.ok) {
          const data = await response.json();
          // 将Token存入本地存储
          localStorage.setItem('jwt_token', data.token);
          // 跳转至主页或权限页面
          window.location.href = '/';
        } else {
          alert('登录失败,请检查用户名或密码');
        }
      } catch (error) {
        console.error('登录请求出错:', error);
        alert('登录请求失败,请稍后重试');
      }
    });
  </script>
</body>
</html>

三、页面权限控制(无Token自动跳转登录)

方式1:单个页面添加权限判断

在需要权限的页面中加入客户端脚本,页面加载时检查Token:

---
// src/pages/index.astro
---
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <title>主页</title>
</head>
<body>
  <h1>欢迎访问主页</h1>

  <script is:inline>
    // 页面加载时检查Token
    window.addEventListener('load', () => {
      const token = localStorage.getItem('jwt_token');
      if (!token) {
        window.location.href = '/login';
      }
    });
  </script>
</body>
</html>

方式2:全局布局统一处理

若多个页面需要权限,创建权限布局组件,所有权限页面复用该布局:

---
// src/layouts/AuthLayout.astro
const { children, title } = Astro.props;
---
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>{title || '权限页面'}</title>
</head>
<body>
  {children}

  <script is:inline>
    window.addEventListener('load', () => {
      const token = localStorage.getItem('jwt_token');
      if (!token) {
        window.location.href = '/login';
      }
    });
  </script>
</body>
</html>

使用示例:在权限页面中引入布局

---
// src/pages/dashboard.astro
import AuthLayout from '../layouts/AuthLayout.astro';
---
<AuthLayout title="控制台">
  <h1>控制台首页</h1>
  <!-- 页面内容 -->
</AuthLayout>

四、与Vue实现的区别说明

你在Vue中用Store管理Token,Astro中无需复杂状态管理:直接操作localStorage即可满足需求,因为Token仅需持久化存储,无需在多组件间共享复杂状态。若后续需存储用户信息等,同样可存入localStorage,或使用Astro服务端状态Astro.locals(仅服务端可用)。

内容的提问来源于stack exchange,提问作者salat_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:45:29