$ _SESSION XMLHttpRequest中的变量为空

时间:2014-05-03 15:48:42

标签: php jquery ajax session

在主机从PHP 4.x升级到PHP 5.4.1之后,我的一个朋友在通过XMLHttpRequest(他使用jQuery)来访问$ _SESSION变量时遇到了很大的问题。

我希望他的代码的以下片段说明了他的问题:

的index.php

<?PHP
    session_start ();
    $_SESSION['chatfenster'] = array();
    $_SESSION['user'] = 1;
?>
<!-- HTML Markup -->
<script type="text/javascript" src="../scripts/jquery/js/jquery-1.8.2.min.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        setInterval(function() {
            $.post("http://www.his-domain.at/ticker_tracker.php", function( feedback ) { alert(feedback); } ) 
        },
        10000);
    });

ticker_tracker.php:

<?PHP
    session_start();
    var_dump($_SESSION);
?>

当他浏览index.php然后手动浏览ticker_tracker.php时,$ _SESSION变量正确地被var_dumped,但是如果通过$ .post()调用php文件,$ _SESSION变量都是空的,从而发出警报只是“array {}”。

Hosters支持说一切都很好,他们根本没有改变任何设置,但我注意到Chrome由于跨域请求而阻止了XMLHttpRequest,给出了错误消息(也只是在升级到PHP 5.4.1之后出现) :

XMLHttpRequest cannot load. No 'Access-Control-Allow-Origin' header is present.

在每个php的最顶层添加Access-Control-Allow-Origin标头解决了这个错误,但主要问题(空$ _SESSION变量)仍然存在。

任何建议表示赞赏。提前谢谢!

1 个答案:

答案 0 :(得分:0)

如果您收到access-control-allow-origin错误(可以通过添加标题解决),那么您正在执行跨域请求。这就是为什么你有不同的会话内容:他们是不同的会议!

这可以是从一个机器(域)到另一个(www.one.com到www.two.com),这可以是从一个子域到另一个(www.one.com vs one.com)或这可能是一个不同的服务(例如http vs https,这些可能由不同的机器或进程提供)。

所有这些都有一个共同点:你有一个似乎要去另一个地方的请求(因此允许来源)。而另一个地方有不同的会议,因为它们不共享。

检查您访问控制的原因:请求不会转到同一个地方。所以&#39;修复&#39;它带有标题只是对原点的修复:删除该修复&#39;,并使请求不需要它。然后你回到相同的服务器/进程/无论什么,并将拥有相同的会话。