跨域时取不到session

本文探讨了在跨域请求场景下如何正确地使用Session进行数据存储的问题,并提供了具体的解决方案,包括设置withCredentials和Access-Control-Allow-Credentials等。

一、问题

今天在一个跨域请求的项目中,需要存储提个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", "域名名称"),我在这里直接取出当前域名,又设置允许,同“*”作用相同。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值