问题描述
我正在使用PHP进行会话,我想知道您是否可以在使用Ajax时将会话从一个域传递到另一个域?
这是domain.com中的index.html
domain.com
index.html -> jQuery
$.post($url,$form.serialize(),function(e){console.log(e)});
这是sub.domain.com中的index.PHP
sub.domain.com
json_encode<-index.PHP
==================== vvv INDEX.PHP PAGE vvv ======================
$session_options = array(
'httponly' => true,'secure' => true,'domain' => 'domain.com'
);
session_set_cookie_params($session_options);
session_name( md5(sha1(md5($data))));
session_start();
switch ($_SERVER['HTTP_ORIGIN']){
case 'www.domain.com':
header('Access-Control-Allow-Origin: www.domain.com');
break;
case 'domain.com':
header('Access-Control-Allow-Origin: domain.com');
break;
}
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
header('Access-Control-Allow-Methods: GET,POST,OPTIONS');
header('Access-Control-Allow-Headers: Origin,Content-Type,X-Auth-Token');
header('Content-Type: application/json');
如果我访问它,并且回到domain.com,则可以在sub.domain.com中创建会话。但是,当我从domain.com调用sub.domain.com时,它不会创建会话并将其传递给domain.com。还是应该做类似JWT或Bearer Token的事情?
现在,我这样做的原因是身份验证,然后在身份验证之后,用户可以对其他应用程序功能进行其他调用。
因此,我想尽我最大的努力,将ajax(sub.domain.com)移至同一域以进行调试/测试。当我使用来自同一域(domain.com)的Ajax进行呼叫时,它可以工作并在浏览器中设置PHP会话cookie,而无需导航到ajax文件夹(例如以物理方式打开页面)。它甚至可以毫无问题地跨域访问子域。但是,如果我将ajax放回子域,而没有物理打开页面,则不会在Ajax调用中设置它。
解决方法
经过数小时的研究,然后对Google.com进行了反向工程,我发现google使用的是Jsonp数据类型。更改了我的Ajax请求的dataType后,我可以使其跨域工作。
$.ajax({
type: "GET",url: 'URL_GOES_HERE',data: form.serialize(),success: function(data,status,xhr){
console.log(data);
console.log(status);
console.log(xhr.getAllResponseHeaders());
},dataType: 'jsonp'
});
现在,这样做的缺点是沉重的。 jsonp只能在GET中工作