开发中遇到的 cookie 问题

文章讲述了在处理跨域请求时,如何解决Cookie无法携带的问题。重点讨论了XMLHttpRequest和fetch的withCredentials设置,服务端Access-Control-Allow-Origin的配置,以及Chrome浏览器升级后Cookie的SameSite属性默认值变化对跨域请求的影响。提供了解决方案,包括修改Chrome的Flag设置,使用特定版本的Chrome命令行参数,以及应对新版本Chrome的策略调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. cookie 无法跨域携带问题

尽管已经登录,但是请求接口返回状态码:202,msg: '未登录',如下图所示;

1.1 XMLHttpRequest.withCredentials未设置

如果需要跨域 AJAX 请求发送 Cookie,需要withCredentials属性设为true。

① axios 按下图所示配置

② fetch 按下图所示配置

1.2 Access-Control-Allow-Origin 配置为*

如果 1.1 节确认已经配置,接口仍返回msg:'未登录',此时可以查看服务端 Access-Control-Allow-Origin 是否设置为 *,这是因为:

  • 请求的首部中携带了 Cookie 信息,如果 Access-Control-Allow-Origin 的值为“*”,请求将会失败。
1.3 浏览器问题

原因:Chrome 升级到80版本之后 cookie 的 SameSite 属性默认值由 None 变为 Lax,这也就造成了一些访问跨域 cookie 无法携带的问题。

SameSite 有三个值:

  • Strict:仅允许一方请求携带 Cookie,即浏览器将只发送相同站点请求的 Cookie,即当前网页 url 与请求目标 url 完全一致
  • Lax:允许部分第三方请求携带 Cookie
  • None:无论是否跨域都会发送 Cookie

80 版本之前默认是 None,80 版本之后默认是 Lax,所以会有一些跨域请求没有携带 Cookie


解决办法一:

  • Chrome 版本 < 91,输入 chrome://flags/ ,搜索 SameSite by default cookies ,将图中两项设置为 disabled,然后 relaunch

  • Chrome 版本 ≥ 91,使用命令行(未验证
open -a "Google Chrome" --args 
--disable-features=SameSiteByDefaultCookies
  • Chrome 版本 ≥ 94,上述方式都被移除,只能通过本地代理、跨域请求等方法转为非跨域请求等方式

参考

Cookie SameSite 属性

 解决办法二:

91以上版本除使用以上命令行外,也可以使用如下 Chrome 扩展工具;

📎cookie插件v0.2.1.zip

结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小二哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值