0

我非常接近一个优雅的跨域会话共享解决方案(我很乐意将它发布到 CakePHP 社区),但我需要最后一次轻推才能完成它。

Cake 的本地 DB 支持的会话处理似乎相当缺乏,但我讨厌在它之上进行破解。它似乎不支持从服务器 A(存在于数据库中)传递活动会话 ID (sid),然后在服务器 B 上使用该 ID(和完整的数据)启动一个新会话。

这是我得到的地方:

我设置 Security = Low,并测试单服务器登录等以确保会话正常运行。查看。

我成功地将 sid 字符串从服务器 A 传递到服务器 B。现在在服务器 B 上...

我运行 CakeSession::id($sid_from_server_a)。

我解析出会话数据库表中的数据字段,并通过 $this->Session->write('blah','value') 将它们存入活动会话。

我重新阅读了会议以确保它“接受”了。

但是当我导航到一个新页面时,活动 sid 只是快速回到一个完全不同的 sid,该 sid 与其他页面加载保持相同(即使我刷新从服务器 A 重新建立 sid 的页面)。

这是一个cookie问题吗?

我不确定要做什么,但绕过整个 Cake 范例。似乎 Cake 开发人员没有设计会话处理来帮助围绕多个域重新建立现有会话。我认为这是 DB 会话处理程序的主要优点之一。

4

2 回答 2

0

这听起来像是一个 cookie 问题,您需要一个 cookie 来存储您想要返回的会话信息。据我所知,没有其他方法可以回忆那种类型的会话信息。我不确定你的项目需要你保存什么,但是如果没有一些信息,服务器别无选择,只能在跨域时创建一个新会话。祝你好运。

于 2012-08-28T00:36:23.617 回答
0

我在服务器 B 上要做的就是正确地重新初始化会话。很基本:

session_write_close(); // close any session that has already initialized
CakeSession::id($sid_from_server_a); // or: session_id($sid_from_server_a);
session_start();

在此之前我假设我需要的只是第二行,在 CakeSession 包装器中设置新的 sid 会提示会话开始。但它更类似于以旧的 PHP 方式运行 session_id($some_sid) ......您可以这样做以在实际启动之前设置会话。

一般来说,我有一些模糊的概念,即 CakePHP 会在我想要的时候自动启动会话,但真正扫描 CakeSession 类表明它并没有做太多事情——它是一个用于原生 PHP 会话处理的隐蔽方便的包装器。

我什至不必解析会话数据库表中的伪序列化会话数据和所有爵士乐——完全没有必要。上面的代码可以解决问题:跨域会话共享。

于 2012-08-28T05:06:00.270 回答