【问题标题】:reading PHP session data from asynchronous request从异步请求中读取 PHP 会话数据
【发布时间】:2013-07-03 23:52:18
【问题描述】:

当从 javascript 对 php 文件进行异步调用时,如何确保 php $_session 信息(我相信这是基于 cookie)与异步请求一起发送?

听说cookie信息随所有HTTP请求一起发送,但我发现jquery的$.get()和$.post()请求无法让接收的PHP文件读取$_session信息。

接收php文件试图以正常方式读取$_session信息:

session_start();
if(isset($_SESSION['user'])){
.....

如果在网络浏览器中直接访问接收的php文件,则可以访问会话信息。

谢谢!

* 更新*

我发现失败的是 session_start() 命令。该命令会导致以下文件返回“0”而不是预期的“无可用会话”响应。

whois.php:

 $s = session_start();
 if($s){
    if(isset($_SESSION['user'])){
        if(isset($_POST['name'])){
            echo $_SESSION['user']." ".$_POST['name'];
        }elseif(isset($_GET['name'])){
            echo $_SESSION['user']." ".$_GET['name'];
        }
    }else{
        echo 'no user specified';
    }
 }else{
    echo 'no session available';
 }

为了彻底起见,我通过直接 URL 导航到 Web 浏览器来测试上述 php 文件,并访问 php 会话并输出正确的响应。我想知道为什么它不能异步工作......

根据 Pekka 的请求,这里是发出异步请求的 php 文件:

 <?PHP
 session_start();
 if(isset($_GET['user'])){
    $_SESSION['user'] = $_GET['user'];
 }

 ?>

 <html>
 <head>
 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
 <script type="text/javascript">
    $(document).ready(function(){
        $("#response").html('---');

        $("#form").submit(function(){
            var formData = $(this).serialize();

            $.post("whois.php",formData,function(data){
                $("#response").html(data);
            });

            return false;
        });
    });
 </script>
 </head>
 <body>
    <form id="form">
        <input name="name" type="text"/>
        <input name="submit" type="submit"/>
    </form>
    <div id="response">
    </div>
 </body>
 </html>

【问题讨论】:

  • 这是不正确的。当您进行 ajax 调用时,会话 ID 与请求一起在 cookie 中发送,并且接收请求的 php 文件能够读取会话数据。如果没有,那么你做错了什么,比如只让你的cookies http(我认为)。
  • 是的,这应该可以。会话 cookie 应该在每个 Ajax 请求中携带。
  • 这就是我一直在阅读的内容,它应该可以工作......但它没有。是否有任何默认的服务器设置或默认的 PHP 设置可以解决问题?我已经在基于 Apache 和 IIS 的本地主机上尝试过,但没有运气。
  • 你能显示更多代码吗,例如你是如何发出 Ajax 请求的?
  • @Twisted1919:在 JS 脚本中根本无法读取 httponly cookie。它们仍将在所有 ajax 请求的 http 标头中发送。如果不是这样,ajax 将毫无用处,因为您将无法维护许多站点的登录。

标签: php jquery ajax session


【解决方案1】:

我认为真正的问题在于 PHP 会话管理。如果您执行 session_start() 与执行 fopen(SESSION_FILE, 'rw') 相同 - 换句话说,您正在打开会话文件进行写入。这对于第一个请求是可以的。但同时第二个请求被服务器接受并试图做同样的事情:打开会话文件进行写入。这将在许多系统上失败。但仍然很奇怪,我希望第一个请求完成,而第二个请求等待第一个调用session_destroy()session_write_close()。一旦完成或超时,第二个请求可能会访问会话并继续工作...... :)

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2015-12-25
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多