为什么在php中通过ajax请求时会话id会发生变化


Why does the session id change when requesting through ajax in php?

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

我的网站是Monkey。Monkey对香蕉的/app/ajax_loggedin运行一个简单的GET-json,返回loggedin值1或0。

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

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

有什么解决方法或其他方法吗?

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

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

如果您使用的是标准的PHP会话处理程序,则会话cookie将有一个与其关联的(如果未在PHP.ini或代码中进行配置,则可能只是第一次调用脚本的域(。因此,例如,如果您从域www.stackoverlow.com调用一个调用session_start()的脚本,而chat.stackoverlow.com上的另一个脚本启动了一个会话,它将无法访问域www.stack overlow.com的cookie,因此将开始一个新的会话。

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

有关更多详细信息,请参阅session_set_cookie_params和session_get_cookie_params。。。

cookie可用于的域。将域设置为"www.example.com"将使cookie在www子域和更高子域中可用。较低域(如"example.com"(可用的Cookie将可用于较高子域(如"www.example.com"。以匹配所有子域。

此外,您应该注意,在securehttp_only参数设置为true的情况下发送的cookie在不安全或JavaScript启动的连接上是不可读的,例如在Ajax的情况下。

获得新会话ID的原因是

  • 您清除了会话ID cookie(通常命名为PHPSESSID(
  • 您访问了一个名为session_regenerate_id((的页面(不太可能(
  • 您的会话已达到最大生存期,并且已被垃圾收集。如果banana.com有很多访问者,这是一种明显的可能性,因为垃圾是在调用PHP时随机收集的
  • session_id((是用其他会话调用的

那该怎么办呢?

  • 签出服务器上的会话文件。它们是简单的文本,所以你可以打开它们,看看里面有什么。请确保您的会话存在
  • 请检查php.ini以获得较短的会话生存期
  • 将会话加载到其他内容中,然后查看是否继续。使用带有自定义会话处理程序的MySQL/memcached系统可能会发现问题

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

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

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

以下是php手册:http://php.net/manual/en/class.sessionhandler.php