【问题标题】:Maintaining $_SESSION data while making ajax requests through jquery in PHP?在 PHP 中通过 jquery 发出 ajax 请求时维护 $_SESSION 数据?
【发布时间】:2023-04-02 19:54:02
【问题描述】:

我正处于一个体面项目的最后阶段(至少对我而言),我遇到了一个问题,即我的 ajax 请求没有将 $_SESSION 数据发送到它们正在加载的 URL。我正在尝试使用 Gdata 自动上传 YouTube 上的文件。我使用 jquery 发出 ajax 请求,但是当我在名为 PHP 脚本的 ajax 中测试 $_SESSION['sessionToken'] 时,我什么也没得到。

这是我的代码,它正在调用 YouTube 上传脚本:

function uploadVideos(id, upload, selected) {
        var status = document.getElementById('currentStatus');
        var fields = upload[id].split(":", 2);

        var token="<?php echo $_GET['token'];?>";
        var dataString = 'videoId='+ fields[0]; // + '&token=' + token;

        id++;
        status.innerHTML = "<b>Videos for Upload:</b>&nbsp;&nbsp;&nbsp; <h3 class='status'>Currently Updating Bout #" + fields[1] + " (" + id + " of " + upload.length + " videos)</h3>";

        $.ajax({  
            type: "GET",  
            url: "upload.php",  
            data: dataString,
            success: function(txt) {
                if (txt != 'Success') {
                    alert(txt);
                } 

                if (id < upload.length) {
                    uploadVideos(id, upload, selected);

                } else {

                    status.innerHTML = "<b>Videos for Upload:</b>&nbsp;&nbsp;&nbsp; <h3 class='status'>Completed</h3>";
                }

                //deselect the checkbox
                document.videos.video[selected[id-1]].checked = false;
                document.videos.video[selected[id-1]].style.display = 'none';
            },
            async: true

        }); 
}

如何将 sessionToken 发送到upload.php,让它相信我已通过身份验证?

【问题讨论】:

  • 我可能在这里包含了更多真正有用的代码。我基本上只是想要一种向 .ajax 请求添加类似“session: sessionString”的方法。
  • 以防万一,$_SESSION 中的任何内容都只在服务器上,而不在客户端上。您需要确保令牌是从浏览器发送的,通常是通过 cookie。
  • 我知道我有 cookie。我可以在我包含的脚本上回显“$_SESSION['sessionToken']”,并且我看到了令牌的值。我也想将该值放在我的 ajax 请求的标头中,但我不知道如何这样做。
  • 如果您的会话中有令牌,则不必通过 ajax 请求发送它。您必须发送的唯一令牌是 PHPSESSID,浏览器会自动执行此操作(使用 cookie)。 PHP 在内部使用 sessid 在每次执行时加载所有会话变量(包括“sessionToken”),无论是 ajax 调用还是常规请求。

标签: php jquery ajax session-cookies gdata


【解决方案1】:

第一: 您没有通过 Ajax 调用发送“令牌”变量。您发送的变量 dataString 不包含 token 变量。您已将令牌部分注释掉...

var token="<?php echo $_GET['token'];?>"; 
var dataString = 'videoId='+ fields[0]; // + '&token=' + token;

第二: 您只能使用 POST 或 GET 发送 Ajax

在你的 ajax 调用中你使用的是 GET,所以你应该检查 $_GET;不是 $_SESSION。

【讨论】:

  • 我已将 GET 令牌注释掉,因为它是每个 Gdata 一次性使用的令牌。我可以让它为一次上传工作,但随后的上传将失败。你可以看到我的uploadVideos()函数是递归的,所以我需要能够多次调用它。 Gdata 需要使用会话令牌来实现这一点。我的请求仍然是 GET 或 POST(在这种情况下为 GET),但我应该能够设置 cookie。对吗?
  • 在从 $_SESSION 读取之前尝试在您的 upload.php 中调用 session_start()
  • 是的。我同意@Christian。你还记得在所有需要访问会话的地方调用 session_start() 吗? Ajax 仍应将会话 ID 发送回,因为它是调用您的脚本的浏览器。
  • 克里斯蒂安明白了!一旦我设置开始会话,它就完美地工作了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多