Response中set-cookie里有值,但是浏览器cookie却没有

it2024-11-24  13

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

 

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

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

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

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

一级域名相同.二级域名不相同,且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.

最新回复(0)