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

Nuxt3中localStorage存储auth token页面刷新后失效问题求助

解决方案

1. 修复Pinia状态刷新丢失问题

修改Pinia的状态初始化逻辑,让页面刷新时自动从localStorage恢复已保存的用户和token信息:

import { defineStore } from 'pinia'
import { axiosInstance } from '@/axios.config'
import { useRouter } from 'vue-router'

export const useAuth = defineStore('auth',{
    state: ()=>({
        // 初始化时从localStorage读取数据,没有则设为空值
        user: JSON.parse(localStorage.getItem('user') || '[]'),
        access_token: localStorage.getItem('access_token') || '',
    }),

    actions:{
        async loginUser(email:string, password:string){
            try{
                const res = await axiosInstance.post('/login',{email, password, withCredentials: true,})
                this.user = res.data.user
                this.access_token = res.data.access_token
                // 同时把用户信息存入localStorage
                localStorage.setItem("access_token", res.data.access_token)
                localStorage.setItem("user", JSON.stringify(res.data.user))
                useRouter().push('/')
              
             }catch(e){
                console.log(e.response?.data || e)
            }
        },
        // 可选:添加登出方法,清理状态和本地存储
        logout() {
            this.user = []
            this.access_token = ''
            localStorage.removeItem('access_token')
            localStorage.removeItem('user')
            useRouter().push('/login')
        }
    },
})

2. 用Axios拦截器动态设置Token

Axios实例创建时的Authorization头是静态的,只会初始化一次,刷新后不会重新读取localStorage的token。改用请求拦截器,每次请求前动态注入token:

import axios from 'axios'

const API_URL = 'https://quiz.bojarm.pl/api';

export const axiosInstance = axios.create({
    baseURL: API_URL,
    headers: {
        "Content-Type": "application/json",
        Accept: "application/json",
        // 移除无效的跨域头:前端设置Access-Control相关头无效,需后端配置
    },
})

// 请求拦截器:每次请求前动态添加token
axiosInstance.interceptors.request.use(
    (config) => {
        const token = localStorage.getItem('access_token')
        if (token) {
            config.headers.Authorization = `Bearer ${token}`
        }
        return config
    },
    (error) => Promise.reject(error)
)

// 可选:响应拦截器,处理token过期场景
axiosInstance.interceptors.response.use(
    (response) => response,
    (error) => {
        // 后端返回401时,说明token失效,触发登出
        if (error.response?.status === 401) {
            const authStore = useAuth()
            authStore.logout()
        }
        return Promise.reject(error)
    }
)

关键注意点

  • 前端无需设置Access-Control-Allow-Origin、Access-Control-Allow-Headers,这些是后端服务器需要配置的响应头,前端设置无效。
  • Pinia状态初始化时从localStorage读取,保证页面刷新后状态不丢失。
  • Axios拦截器动态注入token,避免实例初始化时token未读取的问题。

内容的提问来源于stack exchange,提问作者Cyprian Wacław

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:15:35