2012-01-14 83 views
0

我正在尋找將會話轉換爲客戶端變量,以便我可以遷移到集羣環境。ColdFusion序列化客戶端變量

我想知道是否有任何聰明的方式來做到這一點。我想我可以編寫一些標準的例程,它有一個setter/getter,你總是用它來設置/獲取客戶端變量。理想情況下,這種方法只適用於每個cfm/cfc。

我想有一個application.Client對象,將做到這一點,這樣做

application.Client.set( '名稱',變量)

然後

application.Client的.get('name',變量)

序列化會發生在那裏。在走向這條路之前,有沒有人做過類似的事情,是根據類型對數據進行串行化,例如Stuct vs Array vs Query等。

回答

2

這很難,因爲正如您在之前的一個問題中所述,CLIENT範圍不能完全模擬SESSION範圍,因爲它只能包含簡單的變量。例如,您不能在CLIENT中存儲結構。

但是,這些簡單變量類型之一是一個字符串。

因此,從理論上講,如果有一種方法可以將複雜的數據結構序列化爲字符串,它可以工作。

幸運的是,你有一個機制來做到這一點:<CFWDDX>

<cfset data = StructNew() /> 
<cfset data.name = "Dale" /> 
<cfset data.type = "CF Programmer" /> 

<cfwddx action="cfml2wddx" input="#data#" output="serial" /> 

<cfset CLIENT.data = serial /> 

如果你瀏覽一下你的CLIENT.data VAR(串行)你會看到它看起來像:

<wddxPacket version='1.0'><header/><data><struct><var name='TYPE'><string>CF Programmer</string></var><var name='NAME'><string>Dale</string></var></struct></data></wddxPacket> 

請記住,這不適用於所有解決方案。您無法序列化CFC。還要記住,cookie有一個大小限制(在某些配置中CLIENT變量可以物理存儲),因此您有可能會從非常大的數據結構中丟失數據。

如上所示,您可以將此序列化/反序列化封裝在您駐留在應用程序範圍內的CFC中。 <CFWDDX>的便利之處在於它對於結構,數組和所有其他類型都是通用的。

也許不是一個非常健全或長期的解決方案,但可能會指出你在正確的方向。

+2

當然,如果cookie限制使用數據庫存儲,則可以避免這種限制(更有可能,因爲它更類似於會話存儲並降低安全風險)。另外,不要忘記,您可以使用JSON和WDDX一樣序列化。 – 2012-01-14 01:35:22

+0

+1這兩個建議,非常好的替代品。 – 2012-01-14 01:41:19

1

無論基礎對象如何,序列化本身都應該是相同的。你可以用JSON或WDDX序列化,但是我會用JSON去,因爲它不那麼冗長。您應該注意,您只能將可序列化的對象存儲在客戶端作用域中 - 如果您的會話作用域引用了組件,例如,那些將無法序列化並存儲在客戶端作用域中。除此之外,你的基本方法應該可以正常工作。

+0

是的,我認爲我更喜歡JSON,我擔心DB的大小。 – 2012-01-14 01:51:56

0

對於我的一個項目,我使用了同樣的方法。通常我在每個應用程序的地方都使用客戶端變量,所以我調用了客戶端變量onRequest,將其反序列化並存儲在請求變量中以使其可用。

希望得到這個幫助。