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

Nuxt 3 SSR刷新受保护路由时无法发送Cookie的问题求助

解决Nuxt 3 SSR刷新时Cookie无法传递的问题

1. 修复localStorage is not defined错误

前端日志的这个报错,是因为SSR过程中服务器端不存在localStorage对象。把你userStore里所有用到localStorage的地方,替换成Nuxt提供的useCookie组合式——它能自动兼容SSR和CSR环境:

// composables/stores/user.js 示例
export const useUserStore = defineStore('user', () => {
  // 用useCookie替代localStorage存储token
  const accessToken = useCookie('access_token');
  const refreshToken = useCookie('refresh_token');

  const clearUser = () => {
    accessToken.value = null;
    refreshToken.value = null;
  };

  // ...其他store逻辑
});

2. 让Axios在SSR时正确携带Cookie

SSR时,浏览器的Cookie会通过请求头发送到Nuxt服务器,但Axios发起的后端请求不会自动携带这些Cookie,需要手动转发。修改你的Axios插件plugins/api.js:

import axios from 'axios';
import { useUserStore } from '~/composables/stores/user';
import { useRouter, useRequestHeaders } from '#imports';

export default defineNuxtPlugin(nuxtApp => {
  const router = useRouter();
  // SSR时获取请求头中的Cookie
  const headers = useRequestHeaders(['cookie']);
  
  const api = axios.create({
    baseURL: nuxtApp.$config.public.apiBaseUrl,
    withCredentials: true,
    // 服务器端渲染时,把请求头的Cookie传递给Axios
    ...(process.server && { headers }),
  });

  // ...原拦截器逻辑保持不变

  return {
    provide: {
      api,
    },
  };
});

3. 调整后端Cookie配置

确保后端设置Cookie时,配置正确的跨域和安全参数:

// Express后端设置Cookie示例
res.cookie('access_token', accessToken, {
  httpOnly: true, // 可选,提升安全性
  secure: process.env.NODE_ENV === 'production', // 生产环境启用HTTPS
  sameSite: 'lax', // 跨域场景可设为'none'(需配合secure: true)
  maxAge: 15 * 60 * 1000, // 15分钟有效期
  domain: process.env.COOKIE_DOMAIN || 'localhost',
});

同时后端CORS配置要允许携带凭证:

app.use(cors({
  origin: process.env.FRONTEND_URL || 'http://localhost:3001',
  credentials: true,
}));

4. 优化受保护路由的中间件

创建路由中间件,在SSR和CSR场景下统一验证用户身份:

// middleware/auth.js
export default defineNuxtRouteMiddleware(async (to, from) => {
  const accessToken = useCookie('access_token');

  if (!accessToken.value) {
    return navigateTo('/login');
  }

  // 可选:验证token有效性
  try {
    const { $api } = useNuxtApp();
    await $api.get('/users/me');
  } catch (error) {
    const userStore = useUserStore();
    userStore.clearUser();
    return navigateTo('/login');
  }
});

在受保护页面中启用中间件:

// 目标页面组件
definePageMeta({
  middleware: 'auth',
});

关键注意点

  • 禁止在SSR期间调用浏览器专属API(如localStorage、window),状态存储优先用useCookie或Nuxt官方状态管理方案。
  • Axios必须开启withCredentials: true,确保客户端请求自动携带Cookie。
  • 跨域场景下,后端CORS和Cookie的sameSite、domain配置必须匹配,否则Cookie无法正常传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:05:56