vue3中用axios请求怎么添加cookie

时间:2024-10-15 09:57:00

在 Vue 3 中使用 axios 发起请求时,可以通过配置 axios 的请求选项来携带 Cookies。具体来说,确保跨域请求时,设置 withCredentials: true,以便发送和接收 Cookies。

1. Axios 配置携带 Cookie

首先确保你在 axios 请求中设置了 withCredentials: true,这样浏览器在跨域请求时会携带 Cookies。

示例:
import axios from 'axios';

axios.defaults.withCredentials = true; // 默认在每次请求时携带 cookies

// 发起请求示例
axios.get('https://api.example.com/data', {
  // 额外配置选项(如果需要)
  withCredentials: true, // 在单个请求中指定是否携带 cookies
})
.then(response => {
  console.log(response.data);
})
.catch(error => {
  console.error('Error fetching data:', error);
});

2. 跨域请求时配置 withCredentials

当你的请求跨域时(请求的 URL 和前端项目的 URL 不同),需要在请求头中设置 withCredentials 以便携带 Cookies,同时后端服务器也需要允许跨域的 Cookies。

Vue 3 中的 Axios 全局配置:

你可以在 Vue 项目中通过全局配置 axios 来确保所有请求默认携带 Cookies:

import { createApp } from 'vue';
import App from './App.vue';
import axios from 'axios';

// 设置axios全局配置
axios.defaults.withCredentials = true; // 所有请求都携带 Cookies

const app = createApp(App);

// 将axios挂载到全局
app.config.globalProperties.$axios = axios;

app.mount('#app');

单个请求中设置 withCredentials

你也可以只在特定请求中指定 withCredentials

axios.post('https://api.example.com/login', { username, password }, {
  withCredentials: true // 仅针对该请求携带 Cookies
})
.then(response => {
  console.log('Login successful');
})
.catch(error => {
  console.error('Error logging in:', error);
});

3. 确保后端允许 Cookies

后端也需要正确设置 CORS 头来允许 Cookies。具体配置如下:

  • 允许跨域:后端必须设置 Access-Control-Allow-Origin,并且不能为通配符 *,而是指定具体的域名。
  • 允许携带 Cookies:设置 Access-Control-Allow-Credentials: true
示例(Node.js/Express):
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', 'https://your-frontend-domain.com'); // 指定允许的前端域名
  res.header('Access-Control-Allow-Credentials', 'true'); // 允许携带 Cookies
  next();
});

4. 浏览器限制

请注意,某些浏览器会对跨域请求的 Cookies 携带有一定限制,确保你在客户端和服务器端都配置正确的 CORS 头,并且后端允许设置 credentials

通过这些步骤,你就可以在 Vue 3 中使用 axios 请求时携带 Cookies。

进一步提问: 如果还没有域名,可以指定前端使用的ip+端口号么?

可以的,如果还没有域名,你可以在后端指定前端的 IP 地址和端口号来允许跨域请求并携带 Cookies。Access-Control-Allow-Origin 头可以设置为前端运行的 IP 地址加端口号,这样跨域请求就能正常进行。

示例:指定 IP + 端口号

假设你的前端在本地运行,IP 是 192.168.1.100,端口号是 8080,你可以在后端 CORS 配置中指定这个 IP 和端口号。

Node.js/Express 示例:
app.use((req, res, next) => {
  // 指定允许的前端 IP 和端口
  res.header('Access-Control-Allow-Origin', 'http://192.168.1.100:8080'); 
  res.header('Access-Control-Allow-Credentials', 'true'); // 允许携带 Cookies
  res.header('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS'); // 允许的方法
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); // 允许的请求头
  next();
});
后端必须做的设置:
  1. Access-Control-Allow-Origin:指定前端的 IP 地址和端口号,格式为 http://<IP>:<PORT>,比如 http://192.168.1.100:8080。你不能使用通配符 *,因为浏览器要求在使用 withCredentials: true 时,Access-Control-Allow-Origin 必须是具体的域名或 IP,而不能是 *
  2. Access-Control-Allow-Credentials: true:允许服务器接收带有 Cookies 的请求。
  3. 前端使用 withCredentials: true:确保 axios 请求中启用了 withCredentials: true 选项,以便在跨域请求时携带 Cookies。
示例:前端的 axios 请求
axios.get('http://your-backend-ip:port/api', {
  withCredentials: true,  // 确保发送和接收 Cookies
})
.then(response => {
  console.log(response.data);
})
.catch(error => {
  console.error('Error:', error);
});

注意事项:
  • IP + 端口号:确保你在 Access-Control-Allow-Origin 中指定的 IP 和端口 和前端访问的 URL 完全匹配(包括 httphttps 协议)。
  • 本地环境下的变化:如果本地 IP 地址或端口发生变化,需要相应地调整后端的 CORS 配置。
  • 跨域请求调试:浏览器会严格遵守跨域规则,如果配置不正确,可能会报 CORS 错误。可以通过浏览器的开发者工具(网络请求选项)来查看跨域请求是否成功。

通过这种方式,在没有域名的情况下,你可以使用 IP + 端口号 配置后端的跨域请求并携带 Cookies。