Coldfusion MX技巧精华收集(1)第4/5页
更新时间:2007年03月15日 00:00:00 作者:
让客户端变量逾期
这些方式的其中之一便是客户端变量(client variable)。客户端变量和使用者状态变量(session variables)类似,不同之处在于使用者状态变量是储存在 ColdFusion 服务器的内存中,而客户端变量则是储存在 cookie 里面,Windows 注册数据库(Windows registry)或者外部的数据库服务器里面。这项差异乍看之下并不太重要,然而如果你使用一系列 ColdFusion 服务器搭配组成负载平衡(load-balance)环境的话,这项差异性就变得非常关键了。
在负载平衡服务器环境之下,你永远无法得知哪一部服务器会被指定来处理哪一个使用者发出的请求。负载平衡硬件或者软件纯粹仅是将接收到的使用者请求传递给当时负载最轻的服务器来处理。在这样的状况下我们无法正常运用使用者状态变量,因为某部服务器上面储存的使用者状态变量,对于其它服务器而言都是不可见的。每当负载平衡硬件(或者软件)将同一个使用者从某部伺服器重新导向到另一部服务器(亦即:该使用者的某次请求被分配给 A 服务器来处理,而下一次请求却被分配给 B 服务器来处理),使用者状态变量便会立刻消失不见。
要解决这个问题的方法之一便是使用客户端变量,将使用者相关信息储存在另一部所有参与负载平衡的服务器皆可存取得到的外部数据库里面。然而这项作法本身却又会带来其它必须考量的问题,特别是如果你要透过客户端变量来储存储存敏感性或者安全性资料的时候。你可以设定让客户端变量在某段时间之后便过期失效,但是这个时间间隔最短只能设定成一天。如果你储存的是使用者认证相关资料,你应该会想要让这段逾期时间设定成更短,例如十五分钟。要做到这项短时间逾期功能,你只需要多加一些额外的 CFML 程序代码。
我建立了另一个称作 CF_ClientTimeout 的自订卷标来替你处理这个问题。同样地,你可以直接在 Allaire 公司的开发情报交换中心网站上下载使用。这个卷标透过日期与时间相关函数来把目前时间与使用者上一次存取某个页面的时间加以比对,如果两者的时间差距大于你自己设定的某个时间长度,那么该使用者的相关信息便会被视为已经逾期并且失去效用。如果你在 applicaiton.cfm 这个档案里面使用这个卷标,那么这个卷标便会在同一个应用程序里面的所有页面里头进行这项时间比对工作。相关的程序代码如下:
<CFPARAM NAME="CLIENT.CheckLastVisit" DEFAULT="#CreateODBCDateTime(Now())#">
<CFSET Compare = DateCompare(DateAdd("n", (ATTRIBUTES.TimeOut * -1), CreateODBCDateTime(Now())), CLIENT.CheckLastVisit)>
<CFIF Compare IS NOT -1>
<CFSET CALLER.TimedOut = "Yes">
<CFELSE>
<CFSET CALLER.TimedOut = "No">
</CFIF>
<CFSET CLIENT.CheckLastVisit = CreateODBCDateTime(Now())>
如果你输入 TimeOut 变量的值为 30(TimeOut = 30),那么使用者便会在连续三十分钟没有作任何动作之后,被系统视为已经逾期。一旦被系统视为逾期,下一次该使用者试图再次存取某个页面的时候,这个自订卷标便会传回 TimeOut 变量的值为「Yes」,你可以使用一个 CFIF 叙述来判断这个变量值,并且将逾期使用者的相关客户端变量删除掉,或者修改某个认证变量的值(例如将 CLIENT.VALIDATED 变量的值设定成「No」,CLIENT.VALIDATED = "No"),并且接着执行一段使用者登入程序。
相关文章
ColdFusionMX 编程指南 ColdFusionMX编程入门
ColdFusionMX 编程指南 ColdFusionMX编程入门...2007-03-03ColdFusionMX 编程指南 ColdFusionMX中的循环
ColdFusionMX 编程指南 ColdFusionMX中的循环...2007-03-03
最新评论