2012-08-27 61 views
0

我非常接近優雅的跨域會話共享解決方案(我將愉快地發佈到CakePHP社區),但我需要最後一次微調來完成它。如何通過Cake的數據庫會話處理在兩個域之間共享會話?

Cake的本地DB支持的會話處理似乎很缺乏,但我討厭在它之上進行破解。它似乎不支持從服務器A(存在於數據庫中)傳遞活動會話標識(sid),然後使用該標識(並且數據完好)在服務器B上啓動新會話。

這裏就是我的了:

我設置安全=低,和我考單服務器登錄等,以確保會議表現正常。檢查。

我順利通過從服務器A到服務器B的SID字符串現在在服務器B ...

我跑CakeSession :: ID($ sid_from_server_a)。

我解析出會話數據庫表中的數據字段,並通過$ this-> Session-> write('blah','value')將它們存入活動會話中。

我重新閱讀了會話以確保它「拿走了」。

但是,當我導航到一個新頁面時,活動sid簡單地回退到完全不同的sid,與其他頁面加載保持一致(即使我刷新從Server A重新建立sid的頁面)。

這是一個cookie問題?

我不確定該做什麼,但繞過了整個Cake範例。看起來,Cake開發者沒有設計會話處理來幫助重建多個域的現有會話。我認爲這是數據庫會話處理程序的主要優點之一。

+0

兩者。每個服務器都位於不同的域中。 –

回答

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將促使啓動會話。但它更類似於運行session_id($ some_sid)舊的PHP方式......您可以在實際啓動之前設置會話。

一般來說,我有一個模糊的概念,CakePHP會自動啓動會話,但我真的希望掃描CakeSession類時顯示它沒有多大作用 - 它是用於本機PHP會話處理的簡潔包裝。

我甚至沒有解析出會話數據庫表和所有爵士樂中的僞序列化會話數據 - 完全沒有必要。上面的代碼可以做到這一點:跨域會話共享。

0

這聽起來像是一個cookie問題,您需要一個cookie來存儲您想要返回的會話信息。據我所知,沒有其他辦法可以回想起那種類型的會話信息。我不確定你的項目需要你保存什麼,但是如果沒有一些信息,服務器別無選擇,只能在跨域時創建一個新會話。祝你好運。