PHP会话不是用AJAX持久化的

时间:2015-06-23 21:30:41

标签: javascript php ajax session login

我正在制作一个需要用户登录的网站(在本地开发);我已经使用php-login.net framework作为我的起点,让我的代码与MySQL交谈并创建会话就好了。

我经历过大多数关于php会话和ajax的SO question;但我仍然无法让我的代码按照我想要的方式工作。

现在,我在用户成功登录后使用ajax调用其他一些php脚本,但是它无法正常工作。在firefox中,清除了所有cookie,历史记录等,看起来会话变量不会被ajax调用维护。但是,如果我log-out然后重新登录,则会话变量似乎在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!";
    }

?>

当我使用以前没有登录的浏览器登录时,我看到它设置会话ID X ;但是当按下按钮并进行ajax调用时,我看到一个新的会话ID Y 。然后我注销并重新登录,看到我的会话ID是 Y (在ajax之前),当我点击按钮时,我的会话ID是 Y (在ajax之后) )。

我也注意到如果我一直登录&amp;在没有按下视图样本按钮的情况下,每次都会生成一个新的会话ID。但是,只要按下按钮,就会创建一个全新的会话ID,如果我退出然后重新登录,它似乎总是设置的。

我错过了什么?什么是正确的方法来确保在ajax调用期间保持创建的第一个会话?我应该将会话ID发送到被调用的脚本吗?

1 个答案:

答案 0 :(得分:1)

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

Thisthis帖子很有帮助。

<强> 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!";
    }

?>