jquery 和 php ajax 会话

Posted

技术标签:

【中文标题】jquery 和 php ajax 会话【英文标题】:jquery and php ajax sessions 【发布时间】:2012-05-28 08:26:48 【问题描述】:

这是我的工作:

我的登录表单位于 www.mysite.com/login.html:(子域 www!)

 function authenticate(userName, password) 
    $.ajax
    (
        type: "POST",
        //the url where you want to sent the userName and password to
        url: 'http://server.mysite.com/ajax/auth.php',
        dataType: 'json',
        async: false,
        cache: false,
        data: 'vardas='+userName+'&psw='+password,
        success: function (data) 
                
                    window.location.replace('/main.html');
                
        
    )
    

这是我的 ajax/auth.php:

header('Content-type: application/json');
header ("Access-Control-Allow-Origin: http://www.mysite.com");
header('Expires: ' . gmdate('r', 0));

session_start();
$_SESSION["ok"] = 1111; <- test value

这里是main.php:

<script>
  $(function() 
    $('#home').load('http://server.mysite.com/ajax/loader.php', function() 
    )
  );
</script>
<div id=home></div>

这是我的 ajax/loader.php :)

<?
    header ("Access-Control-Allow-Origin: http://www.mysite.com");
    header('Expires: ' . gmdate('r', 0));

    session_start();

    var_dump ($_SESSION); <---- OUTPUT IS (0) EMPTY!! Why ?
?>

为什么这不起作用?我总是把 $_SESSION 弄空。

【问题讨论】:

这是跨域还是同域? 【参考方案1】:

session_start(); 必须是产生任何输出的第一件事。你把它放在你的header() 东西下面。它需要先行。

在此处查看第一个注释:http://www.php.net/manual/en/function.session-start.php

【讨论】:

【参考方案2】:

您永远不会调用运行 ajax 请求的身份验证来调用 auth.php 并设置会话变量。您调用 session_start 的 .load http://server.mysite.com/ajax/loader.php,但您绝不会调用 authenticate(),因此您的会话永远不会被填满。

此外,尚未完全支持 Access-Control-Allow-Origin,因此根据浏览器的不同,它可能会阻止您的跨域请求。

【讨论】:

我没有看到这是跨域的。一切似乎都在 mysite.com。 跨域也跨子域这是从主 mysite.com 域调用服务器子域,这将被阻止为跨域。 Access-Control-Allow-Origin 允许跨域但不完全支持。【参考方案3】:

我不明白为什么你有一个 login.html 并且在 ajax 执行之后,你有这个 main.php 重定向页面?我对吗?如果是这种情况,为什么不直接在表单提交后重定向用户,让服务器在呈现页面之前验证身份验证?

现在,如果不是这种情况,请始终提醒您通过ajax设置会话数据时不会生效,并且在当前页面中,您将调用它。肯定不行。

【讨论】:

【参考方案4】:

如果所有域都在同一台服务器上,请在调用 session_start 之前在任何地方使用这三行

$session_name = session_name("somename");
ini_set('session.cookie_domain', '.mysite.com');
ini_set('session.save_path', 'C:\tmp');
session_start();

【讨论】:

以上是关于jquery 和 php ajax 会话的主要内容,如果未能解决你的问题,请参考以下文章

php+ajax+jq

PHP未设置会话不起作用

关闭后如何重新打开 php 会话?

如何使用 php/jquery 实现持久页面?

使用 jquery ajax 在会话或会话存储中存储值

如何使用 JQUERY 读取 SESSION 变量