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,将其反序列化并存储在请求变量中以使其可用。

希望得到这个帮助。