【问题标题】:PHP sessions over ajaxajax 上的 PHP 会话
【发布时间】:2017-08-10 08:52:02
【问题描述】:

我已经为我的 ios 应用程序构建了一个 php 后端库,并且我正在使用会话来了解用户是否已登录。但是由于某种原因,即使在设置了会话变量之后,当我尝试检索它时,它被检索为未定义,使我的应用程序认为用户未登录,即使用户已登录。是否有任何替代使用会话,或者我设置我的会话错误?代码如下:

登录调用:

session_start();
// Login stuff
$_SESSION["id"] = /* My id, which isn't undefined */;

检查用户是否登录:

session_start();
if (isset($_SESSION["id"])) {
    $id = isset($_SESSION["id"]);
    echo $id;
    // do stuff
}
else {
    echo "You are not logged in.";
    // user not logged in
    // This condition is always called, and I am not able to change it no matter what I do.
}

【问题讨论】:

  • 您的应用发送会话 cookie 是否正确?
  • 我的应用不发送任何与会话相关的信息,它只发送用户登录信息
  • 你是如何调用脚本的 url 应该是相对的..

标签: php ajax session


【解决方案1】:

Ajax 请求不会自己保存会话 cookie,您可能想使用 JWT 令牌

看看这个JWT tutorial

【讨论】:

  • 谁提到了ajax?客户端是一个 iOS 应用程序。但是,是的,令牌是一个很好的安全解决方案。
  • 标题,我的错。但我需要一些适用于 ajax 的东西。
  • @KingCoder11 会话和令牌在 ajax 或传统 HTTP 请求上同样有效。
  • 我不了解 iOS,但我认为它就像 Android,它们都使用 ajax 请求,JWT 访问令牌是最好的方法。就像 Facebook、谷歌等
  • @ADyson,那样的话,也许我应该用我的数据库来做,我可以设置登录的时间,并据此检查。
【解决方案2】:

编辑:此答案是指最初发布的代码,该代码已由 OP 编辑​​。

if ($id = $_SESSION["id"]) {

应该是

if ($id == $_SESSION["id"]) {

== 不是 =

单个等号将设置左侧变量的值,假设实际设置了$_SESSION["id"],结果将始终评估为true .如果 $_SESSION["id"] 为 null 或未设置,则表达式将始终计算为 false

双精度等于比较两个变量。

但是,更传统的解决方案是:

if (isset($_SESSION["id"])) {

【讨论】:

  • 我的意思是故意使用单个 =,我在 if 语句中将变量 id 分配给该值
  • 如果您正在分配变量,那么您就不会比较变量,因此您不能在该上下文中使用 if 语句。
  • @KingCoder11 if ($id = $_SESSION["id"]) { 将始终解析为 TRUE
  • 好的,我把代码改成if (isset($_SESSION["id"] ))
  • 我刚刚用更新的代码运行了应用程序,@RiggsFolly,你是对的,我之所以不是这样,是因为我有多个会话变量,它们具有相同的 else 语句,但具有不同的如果。
【解决方案3】:

我最终不依赖 cookie 或令牌,而是使用数据库。半小时后用户退出。我在 mysql 中修改了我的用户表,并添加了 2 个新列,loggedIn 作为 booleanlastLoggedIn 作为 timestamp。从那里,我检查了登录后是否已经半小时,如果是,则将loggedIn更改为false,否则,用户已登录。

【讨论】:

  • 听起来您基本上只是使用数据库重新实现了 PHP 会话功能。公平地说,如果您有集群网络服务器,这实际上可能是一个合理的解决方案 - ASP.NET 提供了类似的开箱即用的东西,使用数据库来存储会话状态。如果你有很多用户,你只需要观察性能,因为数据库调用在 CPU、网络 I/O 等方面是相对昂贵的任务。
  • 它是否可以应对同一个用户在多个设备上登录的情况?每个都应该被视为一个单独的会话。会话可以持续超过 30 分钟吗?移动应用程序通常通过使用可刷新令牌来一次持续几天和几周的登录。这消除了一些 UI 的痛苦,因为在移动设备上输入凭据既乏味又缓慢。
  • @ADyson,好点,我没想到。现在我测试它,你是对的,这是一个问题。或许我可以为每台拥有账户的设备生成一个唯一的代码,而每个账户只能在一台设备上使用。
  • 为什么要将帐户限制在一台设备上?如果说,你的银行这样做了,那会很烦人!您想要的是每个会话的唯一代码。会话可能在不同的设备上。它们甚至可能在同一设备上(例如,两个单独的浏览器窗口!)。基本上,您最终会再次获得服务器端会话或令牌。无需在这里重新发明轮子。
【解决方案4】:

就做吧

// On the first page
session_start(); // Login stuff
$user_id = 2; //or something from the database or via authentication.
 $_SESSION["id"] = $user_id;   /* My id, which isn't undefined */;

在目标页面上;

   session_start();
    if(isset($_SESSION["id"])){ 
    $id = $_SESSION["id"];
    echo " session id is set do your processing here.";
    }else{
      echo "session id is not set";
    }

【讨论】:

  • 这将转到 else 语句。
  • 我不明白你的评论
  • else语句正在执行,在你的例子中,sn-p正在执行“session id is not set”
  • 那么 $_SESSION['id'] 没有设置....你必须通过这样做确保它在上一页中设置。 $_SESSION['id'] = $user_I'd;
  • 我只是更新代码...严格按照您的问题解决...确保将用户 ID 分配给全局会话 $_SESSION["id"] 它将是在提供 session_start() 的页面的所有其他部分可用;被称为...我希望这有帮助。谢谢
猜你喜欢
  • 2015-11-10
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2011-08-17
  • 2015-08-18
相关资源
最近更新 更多