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

2022-08-30 20:05:57

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

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

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

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

是否有任何修复或其他方法可以执行此操作?


答案 1

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


答案 2

实际上没有足够的信息来明确回答这个问题。但是,以下是我们可以根据此信息判断的内容。

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

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

有关更多详细信息,请参阅session_set_cookie_paramssession_get_cookie_params...

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

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


推荐