我已登录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"。以匹配所有子域。
此外,您应该注意,在secure或http_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