ajax跨域导致sessionid不一致转载
原创转自:https://www.cnblogs.com/kangjianrong/p/6495131.html
遇到这样的场景,就是前端域。dev,请求接口时,接口的域为beta,即使在服务器端设置也是如此。cookie存储的域,COOKIE_DOMAIN => .roboming.com,虽然cookie域名是正确的,sessionid域仍然是错误的,如下所示:
这是登录页面
这是用户列表页面,无法获取。cookie原因是这两个要求是不同的。sessionid,服务器端,认为尚未登录 。
解决方法是:
1、php服务器端设置运行cros跨域请求
1
2
3
header(
"Access-Control-Allow-Origin:http://dev.roboming.com"
);
header(
Access-Control-Allow-Credentials:true
);
header(
Access-Control-Allow-Methods:GET, POST, OPTIONS
);
第二行代码是允许客户端将cookie
2、js的ajax,设置
xhrFields:{
withCredentials:true
},
设置完成后,再次请求。请求结果如下:
这一次,在请求时,将所有cookie我把它们都带走了。这是我第一次没有把它们带在身上。sessionid,因为sessionid的域是beta在下面,当客户进来的时候。dev域名,所以在申请时,您不能随身携带。beta域下的sessionid。
整份意见书如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$.ajax({
url:
http://beta.roboming.com/api.php?s=/Public/AdminLogin.html
,
type:
POST
,
async:
true
,
xhrFields:{
withCredentials:
true
},
data: {
username:userName,
password:pwd
},
success:
function
(respon){
console.log(respon);
var
res=eval(respon);
},
error:
function
(){
alert(
服务器出错!
);
}
});
原理:
Cross-Origin Resource Sharing,跨域资源共享,简称 CORS可以用作跨域请求和响应的解决方案,但由于以下原因,它的使用频率较低:
1信息更少了。在互联网上找到的大多数“经验”也是被你复制的。我cp他认为,不当使用还可能造成安全隐患。
2目前的主流方法是使用JSONP,易于实现,兼容性好,可以查询很多信息。和 IE10以下 不支持浏览器的版本。 CORS 的 ,因此,如果需要兼容性。IE浏览器,这将导致使用此方法的跨域请求和交付。Cookie该计划失败了,最终将不得不回归。JSONP。
CORS原则是:
W3C我跟你们说:里面,同学们,为了解决跨域交流的问题,我们增加了一个新的标准。当你使用它时,只需添加它~
虽然这是个笑话,但..这是真的。我们之所以能够“互联互通”,是因为 是根基。
CORS如何使用:
以下是模拟 从 A. abc.com 发起一个 B. abc.com 的请求 场景,即E。 本次 “跨域” 并非 “大十字”,但在 根域相同 万一去了 请求 不同的子域 。
首先解释你为什么想要使用它。 子域之间的请求 作为模拟场景:
这是因为大多数人认为跨域是不同根域之间的请求,或者根域是相同的。 不同子域之间存在安全呼叫,这些都是对跨域错误的感知。
事实上,浏览器的同源策略禁止不同子域之间的请求。
需求1:让我过去
这也是最简单的要求,在中。 B 在服务器端程序中,添加响应头:
// 使用通配符 * ,表示当前服务端。 返回的信息允许访问所有源, 不推荐
header(
Access-Control-Allow-Origin:*
);
// 指定受信任域名以接收响应信息, 推荐
header(
Access-Control-Allow-Origin:http://A.abc.com
);
这样,浏览器就不会使用跨域请求。 相同的源安全策略被阻止。
需求二:过马路后,还得动手术Cookie
Well~ 让我们在 B 在服务器端程序中,继续添加响应头:
// 允许携带 用户身份验证凭据(即,允许客户端发送的请求携带Cookie)
header(
Access-Control-Allow-Credentials:true
);
同时,A 在向 B 在发起请求时,您需要 XMLHttpRequest 对象的 withCredentials 属性已设置 true,JQuery1.5.1+ 提供了相应的字段,并按如下方式使用:
1
2
3
4
5
6
$.ajax({
url:
"B. abc.com "
,
xhrFields:{
withCredentials:
true
},
});
这样一来,你就可以在 B 最终发现:哦,也是~ 收到 Cookie 了。
设置 withCredentials 为 true 该请求将包含 A 端的所有Cookie,这些Cookie仍然遵循相应的政策,所以只能访问它的中和。 B 相同根域的末尾Cookie并且不能访问其他域。Cookie。
总而言之:
要跨域,你必须有背景(需要服务器端的合作)。
BTW:Firefox,找到你,然后Chrome真的没有太多不一致的表现。Firefox请勿处于同步模式(async:false)下传递Cookie哦~
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除