关于Axios中写了axios.defaults.withCredentials = true,携带Session还是有问题


前言


这次项目登录的时候利用axios传输的时候发现后台接收的到sessionID但是返回前台的时候cookie却没有sessionID,
网上大多数都是axios.defaults.withCredentials = true,但是没用,解决了一下午,终于找到了答案

一、修改之前

1.登录

代码如下(示例):

 axios({
        widthCredentials: true,
          method: 'post',
          url: "http://location:8080/api/guojia/all/login",
          data: _this.form
      }).then(res => {
          console.log(res)
          if (res.data != null && res.data != "") {
              localStorage.setItem("position", res.data.position.pname)
              sessionStorage.setItem("tabs", "");
              location.href = "../../index.html"
          } else {
              this.$message.error('账号或者密码错误');
          }
      })

2.登录之后读取

代码如下(示例):

 axios({
        method: 'get',
        url: "http://127.0.0.1:8080/api/guojia/all/getUser",
        widthCredentials: true
      }).then(res => {
        _this.User = res.data
        $(".allpage").hide();
        showsItem = _this.User.position.operatingList;
        pageInit()
        $("#hhhh").load("index2.html")
      })

照网上大多数的方法,我已经加上了axios.defaults.withCredentials = true,但是还是没有解决


二、解决方案

不知道大家注意到没有我登录的URL和读取的URL有什么不同,在登录的时候我写的是http://location:8080,看群友说,有时候location返回时前端无法保存到cookie,这是错误一,错误二是读取的时候我写的是http://127.0.0.1:8080,这就导致了两次访问的地址不一样,当然取不到SessionID

三、修改之后

1.登录

代码如下(示例):

 axios({
        widthCredentials: true,
          method: 'post',
          url: "http://127.0.0.1:8080/api/guojia/all/login",
          data: _this.form
      }).then(res => {
          console.log(res)
          if (res.data != null && res.data != "") {
              localStorage.setItem("position", res.data.position.pname)
              sessionStorage.setItem("tabs", "");
              location.href = "../../index.html"
          } else {
              this.$message.error('账号或者密码错误');
          }
      })

2.登录之后读取

代码如下(示例):

 axios({
        method: 'get',
        url: "http://127.0.0.1:8080/api/guojia/all/getUser",
        widthCredentials: true
      }).then(res => {
        _this.User = res.data
        $(".allpage").hide();
        showsItem = _this.User.position.operatingList;
        pageInit()
        $("#hhhh").load("index2.html")
      })

<think>好的,用户的问题是关于在前端代码中如何设置AxioswithCredentials属性为true,以支持跨域请求时携带凭据。我需要结合之前的回答和用户提供的引用来给出准确的信息。 首先,用户之前的问题是关于后端配置Session存放值,我在回答中提到了前端Axios需要设置withCredentialstrue,特别是在跨域情况下。现在用户进一步询问如何具体设置这个属性。 根据用户提供的引用,特别是引用[1]和[3],当设置withCredentialstrue时,后端必须指定具体的源地址,而不能用通配符*,否则会导致跨域问题。引用[4]也提到,当启用withCredentials时,后端必须指定域名。 现在用户想知道在前端Axios中如何配置这个属性。我需要分情况说明:全局配置和局部配置。全局配置会影响所有请求,而局部配置则针对特定请求。同时需要提醒用户注意后端配置的配合,比如Access-Control-Allow-Origin和Access-Control-Allow-Credentials头信息。 还需要注意用户之前的问题中提到前后端分离的情况,所以可能需要提到跨域配置的注意事项,比如Nginx代理或CORS设置。此外,用户可能在实际操作中遇到跨域问题,所以需要给出常见问题的解决方法,比如检查后端是否允许凭据、域名是否匹配等。 另外,用户提供的引用[2]提到,全局设置withCredentialstrue可能导致鉴权问题,所以需要建议用户根据具体情况选择全局或局部配置,并注意潜在的问题。 总结步骤应该是先解释全局和局部配置的方法,然后强调后端配合的必要性,最后给出常见问题排查点。这样用户能一步步了解如何正确配置,避免跨域错误。</think>### 前端 Axios 配置 `withCredentials: true` 的完整方法 --- #### **1. 配置方式与位置** 根据使用场景选择 **全局配置** 或 **局部配置**,以下是具体实现: ##### **1.1 全局配置(影响所有请求)** ```javascript // 在 axios 初始化文件中配置(如 axios.js 或 main.js) import axios from 'axios'; // 核心配置 axios.defaults.withCredentials = true; // 允许所有请求携带凭据(Cookie) axios.defaults.baseURL = 'https://api.yourdomain.com'; // 建议同时配置基础URL // 注意:全局配置需配合后端CORS设置(见第2部分) ``` ##### **1.2 局部配置(针对单个请求)** ```javascript // 在具体业务代码中使用 axios.get('/api/data', { withCredentials: true // 仅当前请求携带凭据 }).then(response => { console.log(response.data); }); // 或 POST 请求示例 axios.post('/api/login', { username: 'user', password: 'pass' }, { withCredentials: true }); ``` --- #### **2. 必须配合的后端设置** 当启用 `withCredentials: true` 时,后端 **必须** 满足以下条件[^3][^4]: 1. **精确指定源地址**: ```http Access-Control-Allow-Origin: https://your-frontend-domain.com ``` (禁止使用通配符 `*`) 2. **允许凭据传输**: ```http Access-Control-Allow-Credentials: true ``` 3. **明确声明允许的请求头**: ```http Access-Control-Allow-Headers: Content-Type, Authorization ``` --- #### **3. 跨域场景下的典型问题排查** | 现象 | 原因分析 | 解决方案 | |--------------------------|--------------------------|--------------------------------------------------------------------------| | 预检请求(OPTIONS)失败 | 后端未正确处理预检请求 | 检查后端是否配置了 `Access-Control-Allow-Methods` 和允许的请求头 | | 响应头缺失 `credentials` | 后端未开启凭据支持 | 确认后端设置了 `Access-Control-Allow-Credentials: true`[^3] | | 域名不匹配 | 前端域名未加入白名单 | 后端 `Access-Control-Allow-Origin` 必须与前端实际域名完全一致[^4] | | Cookie 未持久化 | 前端未设置 Cookie 属性 | 在入 Cookie 时添加 `SameSite=None; Secure`(仅 HTTPS 生效) | --- #### **4. 安全增强建议** 1. **生产环境必须启用 HTTPS** Cookie 和 Session ID 在 HTTP 明文传输会被劫持 2. **限制 Cookie 作用域** ```javascript // 后端设置 Cookie 时添加属性 Set-Cookie: sessionId=abc123; Path=/; HttpOnly; SameSite=Lax; Secure ``` 3. **避免全局启用凭据传输** 仅在需要身份验证的接口局部使用 `withCredentials: true`[^2] --- #### **5. 完整配置示例(Vue + Axios)** ```javascript // src/utils/request.js import axios from 'axios'; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 10000, withCredentials: true // 全局开启(慎用!建议按需局部配置) }); // 请求拦截器(添加鉴权头) service.interceptors.request.use(config => { if (localStorage.token) { config.headers.Authorization = `Bearer ${localStorage.token}`; } return config; }); // 响应拦截器(处理Session过期) service.interceptors.response.use( response => response, error => { if (error.response.status === 401) { router.push('/login'); } return Promise.reject(error); } ); export default service; ``` ---
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值