前后端分离中跨域后ajax请求不携带cookie

最近我在重构一个项目,将原来的web前后端进行分离,在写第一个controller的时候,就遇到一系列的问题,解决了4、5bug后,最后一个就是后端的cookie不能再浏览器appliction->cookies中显示



 

解决方法:(这里需要转载一下)

 因为浏览器的同源策略的限制,不同域名间的请求会造成跨域问题(同源策略是客户端的限制,服务端的互相请求不会有跨域问题)。一般场景下解决跨域问题常用的解决方法都是CORS解决,即配置服务端接受发起请求的域名

 response.header('Access-Control-Allow-Origin', '*'); // *表示支持所有的域名,可以换成具体的域名

    现在ajax的请求可以得到返回值了,但是默认跨域请求是不携带cookie的,如果碰到一些需求必须从cookie中取值,分两种情况

  1. 一级域名相同.二级域名不相同,且cookie在一级域名下,可以设置
 document.domain = '一级域名'

就可以携带cookie了。

2.一级域名不同,可以配置XMLHttpRequest.withCredentials 来允许ajax请求时携带cookie。

(实际解决用了这一步,crossDomain:true和xhrFields设置了)

/* jQuery支持跨域携带cookie */
$.ajax({
    type:'get',
    crossDomain:true, //设置跨域为true
    xhrFields: {
        withCredentials: true //默认情况下,标准的跨域请求是不会发送cookie的
    },
}})
复制代码
/* 原生ajax支持 */
var xhr = new XMLHttpRequest()
 xhr.open("GET",url,true);
 xhr.withCredentials = true;
 xhr.send(null);
 xhr.onreadystatechange = function () {
  if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
    console.log(xhr.responseText)
  }
}
/* axios支持 */
axios.defaults.withCredentials = true

    同时服务器server端要配置Access-Control-Allow-Credentials,我们在客户端设置了withCredentials=true 参数,对应着服务器端要通过在响应 header 中设置Access-Control-Allow-Credentials = true来运行客户端携带证书式的访问。通过对Credentials参数的设置,就可以保持跨域Ajax时传递的Cookie。

response.setHeader("Access-Control-Allow-Credentials", "true");

    服务器server端要配置Access-Control-Allow-Origin到以上配置为止,发送ajax请求,我们发现还会出现一个错误,提示我们 Access-Control-Allow-Origin 不能用 * 通配符。原因是:当服务器端 Access-Control-Allow-Credentials = true时,参数Access-Control-Allow-Origin 的值不能为 '*' 。我们重新设置Access-Control-Allow-Origin的值,当服务器端接收到请求后,在返回响应时,把请求的域Origin填写到响应的Header信息里(即谁访问我,我允许谁),代码如下:

response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

最后补充一点ajax的post请求Content-Type,但仅能是下列之一

application/x-www-form-urlencoded
multipart/form-data
text/plain

不然可能就会报以下的错误

XMLHttpRequest cannot load www.mydomain.com/?/ac... No 'Access-Control-Allow-Origin' header is present on the www.mydomain.com/?/ac... requested resource. Origin 'www.mydomain.com' is therefore not allowed access.

不同domain文件源(协议,ip,端口号) 默认request不传cookie ,response有返回的cookie ,浏览器application中无值
相同domain文件源,不同项目名 默认request传cookie,response无返回cookie,浏览器application中无值
在这里插入图片描述
相同domain文件源,相同项目名 默认request传cookie ,浏览器application中有值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值