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

7320

被折叠的 条评论
为什么被折叠?



