PHP会话对AJAX不持久

PHP session not persistent with AJAX

本文关键字:不持久 AJAX 会话 PHP      更新时间:2023-09-26

我正在制作一个需要用户登录的网站(在本地开发);我以php-login.net框架为起点,让我的代码与MySQL对话并创建会话。

我已经讨论了关于php会话和ajax的大多数SO问题;但我仍然无法让我的代码按我想要的方式工作。

现在,我正在使用ajax在用户成功登录后调用其他一些php脚本,但它不能正常工作。在firefox中,清除了所有cookie、历史记录等后,似乎没有使用ajax调用来维护会话变量。但是,如果我先注销,然后再登录,那么会话变量似乎可以正确地通过ajax传递。

例如:

在我的logged_In.php脚本中,我使用ajax调用另一个脚本:view_samples.php。

logged_in.php

<script type="text/javascript" src="/js/loggedInButtons.js" > </script> <!-- all our ajax calls are here -->
<?php
    // debug some variables
    print_r($_SESSION);
    echo "<br>" . session_id() . "<br>";
    // if logged in
    if ($_SESSION['logged'] == 1) { 
    ?>
        <button class='btn btn-primary' id="view_samples"> View samples</button> <!-- calls view_samples.php -->
        <div id="ajaxResult"></div> <!-- results of ajax calls go here -->
    <?php
    } 
?>

loggedInButtons.js

$(document).ready(function(){
    $("#view_samples").click(function(){
        $.ajax({
            url: "view_samples.php",
            cache: false,
            success: function(result){
                $("#ajaxResult").html(result);
            }
        });
    });
}

view_samples.php

<?php
    session_start():
    // debug session
    print_r($_SESSION);
    echo "<br>" . session_id() . "<br>";
    if ($_SESSION['logged'] == 1) {
      // do something because we are properly logged in
    } else {
      echo "not logged in!";
    }
?>

当我使用以前从未登录过的浏览器登录时,我看到它设置了会话IDX;然而,当按下按钮并进行ajax调用时,我会看到一个新的会话IDY。然后我注销并重新登录,看到我的会话ID是Y(在ajax之前),并且当我单击按钮时(在ajax之后),我的会话标识是Y

我还注意到,如果我继续登录&在不按下视图示例按钮的情况下,每次都会生成一个新的会话id。然而,只要我按下按钮,就会创建一个全新的会话id,如果我注销然后重新登录,它似乎总是被设置的。

我错过了什么?确保创建的第一个会话在整个ajax调用中得到维护的正确方法是什么?我应该将会话id发布到被调用的脚本吗?

这就是我解决问题的方法(因为Freaktor上面的评论没有解决这个问题)-我通过AJAX手动传递会话ID,然后在新的PHP脚本中设置它我想知道是否有人可以对这个的安全性发表评论(因为我不完全确定这一切是如何工作的)?

这篇和这篇文章很有帮助。

logged_in.php

<script>var session_id = '<?php echo session_id();?>';</script> <!-- store our session ID so that we can pass it through ajax -->
<script type="text/javascript" src="/js/loggedInButtons.js" > </script> <!-- all our ajax calls are here -->
<?php
    // debug some variables
    echo "<br>" . session_id() . "<br>";
    // if logged in
    if ($_SESSION['logged'] == 1) { 
    ?>
        <button class='btn btn-primary' id="view_samples"> View samples</button> <!-- calls view_samples.php -->
        <div id="ajaxResult"></div> <!-- results of ajax calls go here -->
    <?php
    } 
?>

loggedInButton.js

var data = {func:'getData1',session_id:session_id}; // manually send the session ID through ajax
$(document).ready(function(){
    $("#view_samples").click(function(){
        $.ajax({
            type: "POST",
            data: data,
            url: "view_samples.php",
            success: function(result){
                $("#ajaxResult").html(result);
            }
        });
    });
}

view_samples.php

<?php
    session_id($_POST['session_id']); // get the session ID sent by AJAX and set it
    session_start():
    // debug session
    print_r($_SESSION);
    echo "<br>" . session_id() . "<br>";
    if ($_SESSION['logged'] == 1) {
      // do something because we are properly logged in
    } else {
      echo "not logged in!";
    }
?>