我希望在鼠标单击后使用AJAX和CORS在域中发布字符串,并且当POST成功时将该字符串用作SESSION变量。当ajax触发done()事件时,我想要打开一个新选项卡到我们之前发布的域并使用SESSION变量。
即使我最初计划使用SharedWorker支持解决此问题,但似乎并不适合它。仅使用URL参数/ GET是不可能的,因为我担心数据的大小可能会太长。
php/receive-post.php
<?php
$origin = $_SERVER['HTTP_ORIGIN'];
if ($origin == 'http://site.a.com') {
header('Access-Control-Allow-Origin: '.$origin);
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With, Cache-Control');
if (isset($_POST)) {
session_start();
$_SESSION['string'] = $_POST['string'];
echo json_encode($_SESSION['string']);
session_write_close();
}
}
来自域名B的index.php
的相关代码
<?php
$string;
session_start();
var_dump($_SESSION);
if (isset($_SESSION['string'])):
$string= $_SESSION['string'];
else:
$string= 'I like bananas';
endif;
session_write_close();
echo $string;
?>
来自域A(jQuery)的脚本
$("a").click(function(e) {
e.preventDefault();
var href = $(this).attr('href');
postString($("textarea").serialize(), href);
});
function postString(myString, href) {
$.ajax({
type: 'POST',
url: 'http://domain.a.com/receive-post.php',
crossDomain: true,
data: myString,
headers: {
'cache-control':' no-cache'
}
}).done(function(data) {
console.log(data);
}).fail(function(a, b, c) {
console.log(a + b + c);
}).always(function() {
console.log("always");
var newTab = window.open(href, '_blank');
if (newTab) {
newTab.focus();
} else {
alert('Your browser blocked opening a new window.');
}
});
}
应该发生的是,在单击域A上的链接后,将打开一个新选项卡,并在那里使用de SESSION变量。但是,这不是发生的事情。
数据的POST操作正常,因为我可以在域B的控制台中验证确实设置了SESSION变量的返回值。新选项卡也会打开。但是,该页面上未使用/设置SESSION变量。 var_dump($_SESSION)
返回一个空数组,这意味着没有设置SESSION变量。
为什么?为什么不在域B上从页面A到页面B的SESSION变量?我如何使其可用?
答案 0 :(得分:1)
您需要添加<service name="yourService">
<endpoint address="http://localhost:2112/ys" binding="basicHttpBinding" name="basicHttpEndPoint"
contract="zza.Services.IzzaService" />
<endpoint address="net.tcp://localhost:**2112**/" binding="netTcpBinding"
name="netTcpEndPoint" contract="IyourService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:**2112**" />
</baseAddresses>
</host>
(请参阅jQuery.ajax docs,xhrFields),否则将不会发送/接受cookie用于跨域请求。
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials:
XMLHttpRequest.withCredentials属性是一个布尔值,指示是否应使用Cookie,授权标头或TLS客户端证书等凭据进行跨站点访问控制请求。 [...]此外,此标志还用于指示何时在响应中忽略cookie。
正如您所说,withCredentials
需要添加到远程域的响应中,以告知浏览器允许其在此URL的跨域请求中包含凭据。