首先通过ajax设置SESSION变量,然后在访问页面

时间:2016-09-15 08:52:12

标签: php ajax session cors

我希望在鼠标单击后使用AJAX和CORS在域中发布字符串,并且当POST成功时将该字符串用作SESSION变量。当ajax触发done()事件时,我想要打开一个新选项卡到我们之前发布的域并使用SESSION变量。

我想要实现的目标,总结

  • 用户在网站A
  • 网站A向网站B上的网页A发送POST请求,并希望将字符串发布到
  • 网站B上的网页A将字符串存储在SESSION变量
  • 成功后,浏览器会在B站点的B页面上打开一个新标签
  • 网站B上的页面B查找SESSION变量并使用它(如果存在)

即使我最初计划使用SharedWorker支持解决此问题,但似乎并不适合它。仅使用URL参数/ GET是不可能的,因为我担心数据的大小可能会太长。

我拥有什么

域名B上的

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变量?我如何使其可用?

1 个答案:

答案 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的跨域请求中包含凭据。