javascript - PHP session 与 AJAX 不持久

标签 javascript php ajax session authentication

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

我已经浏览了大部分 SO question关于 php session 和 ajax;但我仍然无法让我的代码按照我想要的方式工作。

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

?>

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

我还注意到,如果我在不按“查看示例”按钮的情况下继续登录和退出,每次都会生成一个新的 session ID。然而,一旦我按下按钮,就会创建一个全新的 session ID,它似乎始终是我注销然后重新登录时设置的 session ID。

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

最佳答案

这就是我解决问题的方法(因为上面 Freaktor 的评论没有解决问题) - 我通过 AJAX 手动传递 session 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!";
    }

?>

关于javascript - PHP session 与 AJAX 不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31013891/

相关文章:

PHP 在 if 语句中组合 boolean 运算符(AND、OR)

javascript - 使用 POST 纯 javascript 发送 json 对象

PHP闭包范围问题

javascript - 即使在聊天中发送文本后,文本消息也不会清除

javascript - Stimulsoft marginsPx[i].replace 不是 MVC5 中的函数 JavaScript 错误?

javascript - 测试 eventEmiters 的最佳方式?

javascript - 是否可以将属于不同系列的两列分别精确地放置在 highchart 的 x 轴刻度上?

jquery - 销毁 jQuery 自动完成功能

php - jQuery、AJAX - 如何判断脚本是否返回 false

javascript - 使用 Jquery 动态加载 html 的类