跨域情况下,如何正确传输Cookie

跨域情况下,如何正确传输Cookie

测试环境

  1. 前端:jQuery-3.6.0 Chrome-93.0.4577.63
  2. 后端:SpringBoot 2.4.10

Ajax配置

  1. 发送请求时需要把withCredentials设置为true
  2. jQuery的写法
$.ajax({
	type: '...',
	url: '...',
	xhrFields: {
		withCredentials: true
	},
	success: function(a, b, c) {
		//do something
	},
	error: function(a, b, c) {
		//do something
	}
})

后端配置

  1. 在需要被跨域请求的controller上标注@CrossOrigin
  2. 在携带cookie的跨域请求中,@CrossOrigin需要配置参数,主要是originsallowCredentials
  3. origins参数的作用是指定被@CrossOrigin标注的资源允许被哪些域进行跨域访问,在没有显式设置origins时,origins的值默认是*,在这种情况下,响应头将会附带Access-Control-Allow-Origin: *,从而实现没有Cookie的跨域请求。但是对于附带Cookie的请求,服务器不得设置Access-Control-Allow-Origin的值为*,所以需要显式的指定origins
  4. 还需要在响应头中设置Access-Control-Allow-Credentials: true,如果服务器端的响应中未携带 Access-Control-Allow-Credentials: true ,浏览器将不会把响应内容返回给请求的发送者,此时查看控制台会发现有报错信息
//如果需要设置允许所有origins,可以使用originPatterns = {"*"} 
@CrossOrigin(origins = {"//前端请求的源地址,可通过请求头的Origin查看"},
        allowCredentials = "true")

踩到的坑

设置了 Access-Control-Allow-Credentials: trueAccess-Control-Allow-Origin,但是发送的请求中依然不包含Cookie

要注意Cookie的路径问题

  1. cookie 的作用域由 DomainPath 属性决定,假设浏览器保存有一个作用域为 http://127.0.0.1:8080/application/domain-acookie ,那么在访问 http://127.0.0.1:8081/application/domain-b 时,该 cookie 是不会被附带的,这与是否跨域无关
  2. 假设浏览器保存有一个作用域为 http://127.0.0.1:8080/applicationcookie ,那么在访问 http://127.0.0.1:8081/application/domain-b 时,该 cookie 是会被附带的,原因是对子路径的请求会附带上作用域为父路径的 cookie

参考

链接: 跨源资源共享(CORS)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值