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

时间:2015-07-01 13:38:44

标签: php ajax session session-cookies

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

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

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

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

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

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

实际上没有足够的信息来明确回答这个问题。但是,根据这些信息,我们可以告诉您。

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

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

有关详细信息,请参阅www.stackoverflow.comsession_set_cookie_params

  

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

此外,您应该注意,将安全 http_only 参数设置为true时发送的Cookie将无法通过不安全或JavaScript启动的连接进行读取,例如在的Ajax

答案 2 :(得分:4)

您获得新会话ID的原因是

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

那该怎么办?

  • 查看服务器上的会话文件。它们是简单的文字,因此您可以打开它们并查看其中的内容。确保您的会话存在。
  • 检查php.ini的会话有效期。
  • 将会话加载到其他内容中,看看是否继续。使用带有custom session handler的MySQL / memcached系统可以揭示问题。

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

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

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