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

基于Spring Boot+JWT的JS+Thymeleaf前端认证:Token存储与携带咨询

基于JWT Token的前端认证实现(JavaScript + Thymeleaf)

一、Token的存储方案

根据业务场景选择合适的存储位置,各方案优劣如下:

  • LocalStorage:持久化存储,页面刷新或浏览器重启后仍保留。缺点是易受XSS攻击,适合非高敏感操作场景。
    存储/获取代码:
    // 存储Token
    localStorage.setItem('jwtToken', 'your-generated-jwt-token');
    // 获取Token
    const token = localStorage.getItem('jwtToken');
    
  • SessionStorage:会话级存储,仅在当前浏览器会话有效,关闭浏览器后自动清除。同样存在XSS风险,适合临时会话场景。
    存储/获取代码:
    sessionStorage.setItem('jwtToken', 'your-generated-jwt-token');
    const token = sessionStorage.getItem('jwtToken');
    
  • HttpOnly Cookie:安全性最高,能防范XSS攻击(前端JS无法读取),需后端配合配置。适合同域渲染的Thymeleaf项目,后端设置Cookie时添加HttpOnly、Secure标记,浏览器会自动在请求时携带该Cookie,无需前端手动处理。

二、自动给所有请求添加Token

通过封装请求或拦截器,实现所有接口请求自动携带Token:

1. 原生fetch封装

编写通用请求函数,自动注入Token:

async function fetchWithAuth(url, options = {}) {
  const token = localStorage.getItem('jwtToken'); // 根据存储方案调整获取方式
  // 构造请求头,添加Authorization字段
  const headers = {
    ...options.headers,
    'Content-Type': 'application/json',
    'Authorization': token ? `Bearer ${token}` : ''
  };
  return fetch(url, { ...options, headers });
}

// 使用示例
fetchWithAuth('/api/user/info')
  .then(res => {
    if (res.status === 401) {
      // Token过期或无效,清除存储并跳转登录页
      localStorage.removeItem('jwtToken');
      window.location.href = '/login';
    }
    return res.json();
  })
  .then(data => console.log(data))
  .catch(err => console.error(err));

2. axios请求拦截器

如果项目使用axios,可全局配置拦截器实现自动携带Token:

import axios from 'axios';

// 创建axios实例
const api = axios.create({
  baseURL: '/api'
});

// 请求拦截器:自动注入Token
api.interceptors.request.use(config => {
  const token = localStorage.getItem('jwtToken');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
}, error => Promise.reject(error));

// 响应拦截器:处理Token过期
api.interceptors.response.use(response => response, error => {
  if (error.response.status === 401) {
    localStorage.removeItem('jwtToken');
    window.location.href = '/login';
  }
  return Promise.reject(error);
});

// 使用示例
api.get('/user/info').then(res => console.log(res.data));

三、Thymeleaf中初始化Token

Thymeleaf是服务端渲染模板,登录成功后后端可将Token存入Model,页面加载时渲染到JS中完成存储:

<script th:inline="javascript">
  <!-- 从后端Model中获取Token并存储 -->
  const initialToken = [[${jwtToken}]];
  if (initialToken) {
    localStorage.setItem('jwtToken', initialToken);
  }
</script>

四、Bearer Token的传递格式

Bearer Token的标准传递方式是在请求头的Authorization字段中设置,格式为:

Authorization: Bearer <your-jwt-token>

上述代码示例已实现该格式,后端可通过读取请求头的Authorization字段解析Token进行验证。

内容的提问来源于stack exchange,提问作者Mohit Kumar Bhadani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:35:24