父域的接口向子域set-cookie,为何浏览器不会保存cookie?

发布于 2022-09-05 04:20:15 字数 2178 浏览 18 评论 0

我是一个前端菜鸟,和后端(JAVA)配合做一个后台管理系统的项目,之前没做过cookie相关或者说跨域相关的项目,遇到这个问题困扰好多天了,后端小哥跟我都很难受,请大家不吝赐教。

业务逻辑是这样的:由于前后端分开部署,我需要在www.a.com/home/login.html页面上通过ajax调用10.0.2.101的一个用户登录接口,调用成功后接口会返回一个cookie(Set-Cookie: JSESSIONID=xxxxxxxxxxxxxx; Domain=www.a.com; Path=/),JAVA要求我后续调用其他任何接口时必须将cookie随ajax一同发给他,他根据jsessionId做身份验证。

但前端页面www.a.com和后台接口10.0.2.101肯定属于跨域了,浏览器不会响应后台发来的cookie,于是我们就把后端的接口挪到了a.com上,应该从跨域变成同源了吧,因为a.com是www.a.com的父域,结果问题依旧,浏览器不理会a.com发来的set-cookie指令,也不会在ajax到a.com的过程中携带任何手工创建的cookie!
(完全相同域名的情况我测试了,比如a.com调用a.com下的一个php,是可以正常set-cookie以及ajax携带cookie的,但我们正式环境不会允许前、后端在完全相同的域中)

为了便于测试,JAVA部分的代码重写成了PHP,结果浏览器(chrome,FF,IE...)虽然收到response里的cookie,却依然不存储cookie。

PHP代码如下:

<?php
$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';
// 指定允许其他域名访问
header('Access-Control-Allow-Origin:'.$origin);
// 响应类型
header('Access-Control-Allow-Methods:GET');
// 响应头设置
header('Access-Control-Allow-Headers:x-requested-with,content-type');

header('P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"');

// 发送一个简单的 cookie
setcookie("TestCookie1", "my cookie value1", time() + 3600, "/", "a.com");
// 发送一个简单的 cookie
setcookie("TestCookie2", "my cookie value2",-1,"/",".a.com");
?>

JS代码如下:

$.ajax({
    type: "get",
    async: true,
    data: null,
    url: "http://a.com/test/test.php",
    dataType: "json",
    // crossDomain: true, // 这行代码加或不加都试过了
    beforeSend: function(req){
        req.withCredencials=true;
    },
    success: function(data){
        
    },
    error: function(err){
        
    }
})

部分截图如下:

clipboard.png

clipboard.png

clipboard.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

望笑 2022-09-12 04:20:15

不纠结了, apache配置反向代理完美解决..

Apache设置反向代理解决js跨域问题

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文