【问题标题】:Session variable not being set if not in global scope如果不在全局范围内,则未设置会话变量
【发布时间】:2018-06-07 01:09:19
【问题描述】:

我正在尝试使用一系列方法和会话来制作登录系统。它是这样工作的:

  1. 用户通过 XHR 向 domain.com/api/login 发出 POST 请求
  2. Nginx 对 domain.com/api.php?request=url 进行了重写
  3. 文件运行一些验证,如果一切正常,它会实例化目标类,然后使用call_user_func_array 用新实例化的对象调用目标方法。
  4. 调用的方法是UsersController->logIn,该方法运行一些验证,然后调用UsersModel::Condition,简单来说就是选择用户并返回一个包含用户属性和一些方法的对象。
  5. 然后,我们运行$instanceOfUserRow->LogIn(),它会更新该用户的last_logged 列并实例化执行$_SESSION['user_id'] = $this->user_id 的会话。

但是,无论我尝试什么,它都不会设置会话变量。我尝试了以下方法:

  • 为变量命名不同,从user_ididentifier,再到id_test,等等。
  • 不要在UserRow->LogIn方法中设置,而是直接在UsersController->logIn中设置,同样无效
  • 在我的框架的主文件(称为Init.php)中创建了一个名为test 的会话变量。
  • 这个会话变量设置成功并且行为正确,如果我把它重命名为user_id,行为是一样的,我觉得这很奇怪。
  • 创建了一个简单的函数,该函数在名为Init.php 的文件set_session 中的session_start 之后声明,该函数只需获取名称和值并设置如下所示的会话:$_SESSION[$name] = $value;。这也没有用。

此时我不知道该怎么做,在设置任何新变量之前,我确实使用session_status 验证了会话是否处于活动状态。使用自定义自动加载加载类。我不确定罪魁祸首是否是我们分层的文件数量(从原始请求是 API/登录,然后重写为 api.php,然后是 UsersController.php,然后是 UsersModel.php,然后是 UserRow.php)或者如果它可能只是通过call_user_func_array 调用它的事实。

任何帮助或线索都会有所帮助。谢谢。

【问题讨论】:

  • 你在分配给你的会话之前调用了 session_start() 吗?
  • 会话是否与您需要的域不同?
  • 是的,就像我在帖子前面所说的那样,我什至在设置新变量之前使用session_status 确保会话处于活动状态。域是相同的。

标签: php session


【解决方案1】:

事实证明,即使几乎所有内容都相同,我还是使用 HTTPS 查询 API,但请求是从未通过 TLS 的页面发出的。

所以请求是从http://website.lanhttps://website.lan/api 发出的,这导致会话在请求之间发生变化。

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 2016-08-13
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2010-10-21
    • 2023-03-24
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多