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

查看:380
本文介绍了javascript - 父域的接口向子域set-cookie,为何浏览器不会保存cookie?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我是一个前端菜鸟,和后端(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){
        
    }
})

部分截图如下:

解决方案

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

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

这篇关于javascript - 父域的接口向子域set-cookie,为何浏览器不会保存cookie?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆