【问题标题】:Why does the session id change when requesting through ajax in php?为什么通过php中的ajax请求时会话ID会发生变化?
【发布时间】:2015-09-18 17:04:21
【问题描述】:

我已登录 Banana.com。 Banana 在/app/ajax_loggedin上有一个api链接。

我的网站是猴子。 Monkey 运行一个简单的 GET json 到香蕉的 /app/ajax_loggedin,它返回一个登录值 1 或 0。

为什么通过ajax总是返回0,即使我真的登录了Banana并且直接访问链接时也给了我1。 Banana 的开发人员如何解决它?

如果它是服务器端调用,我会理解它,但我不明白为什么它不会告诉我如果我登录,如果 Banana 发出请求。运行session_id()检查,每次通过ajax调用都会生成一个新的,直接访问时它工作得很好并且保持不变。

是否有任何修复或其他方法可以做到这一点?

【问题讨论】:

  • 听起来 Banana 的开发人员需要将会话(具有超时值)存储在表中。然后它可以查询表并判断您是否仍然登录。
  • 这将如何解决?并且不知道 Monkey 到底是什么用户。他们只想知道他们是否登录到 Banana。
  • 显然您必须将其设置为接受参数(用户 ID)来判断是否已登录。
  • 我不明白。所以 Monkey 的站点应该知道发送给 Banana 的用户 ID 吗?这不是我要寻找的,而是用户正在使用的同一浏览器,它应该只是拨打一个电话,以验证正在访问的用户是否已登录 Banana。如果没有意义,我该如何改进我的解释? :(
  • 如果我理解你的话,你需要在banana.com上设置CORS,以便可以从monkey.com发出AJAX请求,除非JSONP是可能的。

标签: php ajax session session-cookies


【解决方案1】:

原始代码和/或 ajax 代码中的某些内容正在设置会话保存处理程序。因此,例如,您的来源可能正在将会话保存到数据库,而 ajax 脚本正在将会话保存到文件。

这里是php手册:http://php.net/manual/en/class.sessionhandler.php

【讨论】:

    【解决方案2】:

    而不是调用 api 并检查会话是否处于活动状态。如果在配置文件中指定了会话 id 的存储位置,则会话 id 将存储在 cookie 中,或者您可以在之后使用以下代码实际检查会话 id 是否设置

    session_start();      
    $session_id=session_id();     
    if(isset($_SESSION[$session_id]))
    

    【讨论】:

      【解决方案3】:

      实际上没有足够的信息来明确回答这个问题。但是,根据这些信息,我们可以得出以下结论。

      如果您使用标准 PHP 会话处理程序,会话 cookie 将有一个与之关联的 域(如果未在 php.ini 或您的代码中配置,则可能只是域脚本最初是从)调用的。因此,例如,如果您调用从域 www.stackoverflow.com 调用 session_start() 的脚本,并且 chat.stackoverflow.com 上的另一个脚本启动会话,它将无法访问域 www.stackoverflow.com 的 cookie,因此将开始一个新的会话。

      cookie 标头中的域可以向上冒泡,但不能向下冒泡。因此,如果您希望您的会话 cookie 能够访问 Banana.com 的所有子域,您必须确保在该域的每个会话初始化请求中正确设置域参数。

      有关详细信息,请参阅 session_set_cookie_params 和 session_get_cookie_params...

      cookie 可用的域。将域设置为“www.example.com”将使 cookie 在 www 子域和更高的子域中可用。可用于较低域的 Cookie,例如“example.com”,将可用于较高的子域,例如“www.example.com”。仍在实施已弃用的 » RFC 2109 的旧浏览器可能需要前导 .匹配所有子域。

      此外,您应该注意,在 secure 或 http_only 参数设置为 true 的情况下发送的 cookie 将无法通过不安全或 JavaScript 发起的连接读取,例如Ajax.

      【讨论】:

        【解决方案4】:

        您会获得新会话 ID 的原因是

        • 您清除了会话 ID cookie(通常命名为 PHPSESSID)
        • 您访问的页面名为 session_regenerate_id()(不太可能)
        • 您的会话点击了max lifetime 并且是garbage collected。如果banana.com 有很多访问者,这是一种明显的可能性,因为在调用 PHP 时会随机收集垃圾
        • session_id() 被另一个会话调用

        那该怎么办?

        • 检查服务器上的会话文件。它们是简单的文本,因此您可以打开它们并查看里面的内容。确保您的会话存在。
        • 检查 php.ini 以获得较短的会话生命周期。
        • 将会话加载到其他东西中,看看是否继续。使用带有custom session handler 的 MySQL/memcached 系统可能会发现问题。

        【讨论】:

          【解决方案5】:

          每个入口点或对服务器 (API) 的调用都需要以 session_start() 开头。如果它没有读入会话标识符,它将表现得好像没有一个,然后返回一个新的会话标识符。当您的浏览器收到响应时,它将用新的标识符覆盖会话标识符。确保在您调用服务器的所有位置的顶部都有 session_start(),以便它知道要使用哪个会话。

          【讨论】:

          • 这不是真的,这取决于你使用的 PHP 版本
          • 我很感兴趣。你能提供参考或例子吗?如果我错了,我想学点新东西。
          • 我想我已经纠正了,这是 ini 文件中关于是否需要使用 session_start 的设置。我只知道,如果您使用 session_start,我编写的许多服务器都会出错。很抱歉投了反对票,它不会让我把它拿下来。
          猜你喜欢
          • 2011-07-19
          • 1970-01-01
          • 1970-01-01
          • 2020-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多