一、问题
今天在一个跨域请求的项目中,需要存储提个session为后续的操作做一个判断依据:
//设置
().setAttribute("name", "存储值");
//获取
().getAttribute("name")
结果获取到的都是null,查阅了相关资料,才了解到这是因为当进行跨域时,每一次请求都没有将sessinId带过去,服务器就认为是一个没有登录的新请求,都会在cookie里set一个新的sessionId,所以我之前存的值永远也取不到。
二、解决
使用的标准是CORS,即跨域资源共享。CORS是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了只能同源使用的限制。
ajax请求设置为如下:
$.ajax({
url: commonUrl + url,
type: 'post',
data: (obj),
//加上 xhrFields及crossDomain
xhrFields: {
withCredentials: true//允许带上凭据
},
crossDomain: true,
//
success:function(res){
},
error:function(){
}
});
同时我还在用中遇到过这样的问题,的处理方式为前端加上 withCredentials: true;
$(url, {withCredentials: true}).then(function (res) {
(res);
})
后台都统一添加:
("Access-Control-Allow-Origin", ("Origin"));//处理跨域
("Access-Control-Allow-Credentials", "true");//表示是否允许发送Cookie
在一开始解决跨域时,我采用的是 ("Access-Control-Allow-Origin", "*") 处理跨域,表示接受任意域名的请求。但是设置了("Access-Control-Allow-Credentials", "true")后,就不能使用“*”,不过要处理好跨域,可以直接设置允许请求的域名:("Access-Control-Allow-Origin", "域名名称"),我在这里直接取出当前域名,又设置允许,同“*”作用相同。