讓客戶端變量逾期
作者: Kyle 2/16/03
內(nèi)容:
讓客戶端變量逾期 這些方式的其中之一便是客戶端變量(client variable)?蛻舳俗兞亢褪褂谜郀顟B(tài)變量(session variables)類似,不同之處在于使用者狀態(tài)變量是儲(chǔ)存在 ColdFusion 服務(wù)器的內(nèi)存中,而客戶端變量則是儲(chǔ)存在 cookie 里面,Windows 注冊(cè)數(shù)據(jù)庫(kù)(Windows registry)或者外部的數(shù)據(jù)庫(kù)服務(wù)器里面。這項(xiàng)差異乍看之下并不太重要,然而如果你使用一系列 ColdFusion 服務(wù)器搭配組成負(fù)載平衡(load-balance)環(huán)境的話,這項(xiàng)差異性就變得非常關(guān)鍵了。
在負(fù)載平衡服務(wù)器環(huán)境之下,你永遠(yuǎn)無(wú)法得知哪一部服務(wù)器會(huì)被指定來(lái)處理哪一個(gè)使用者發(fā)出的請(qǐng)求。負(fù)載平衡硬件或者軟件純粹僅是將接收到的使用者請(qǐng)求傳遞給當(dāng)時(shí)負(fù)載最輕的服務(wù)器來(lái)處理。在這樣的狀況下我們無(wú)法正常運(yùn)用使用者狀態(tài)變量,因?yàn)槟巢糠⻊?wù)器上面儲(chǔ)存的使用者狀態(tài)變量,對(duì)于其它服務(wù)器而言都是不可見(jiàn)的。每當(dāng)負(fù)載平衡硬件(或者軟件)將同一個(gè)使用者從某部伺服器重新導(dǎo)向到另一部服務(wù)器(亦即:該使用者的某次請(qǐng)求被分配給 A 服務(wù)器來(lái)處理,而下一次請(qǐng)求卻被分配給 B 服務(wù)器來(lái)處理),使用者狀態(tài)變量便會(huì)立刻消失不見(jiàn)。
要解決這個(gè)問(wèn)題的方法之一便是使用客戶端變量,將使用者相關(guān)信息儲(chǔ)存在另一部所有參與負(fù)載平衡的服務(wù)器皆可存取得到的外部數(shù)據(jù)庫(kù)里面。然而這項(xiàng)作法本身卻又會(huì)帶來(lái)其它必須考量的問(wèn)題,特別是如果你要透過(guò)客戶端變量來(lái)儲(chǔ)存儲(chǔ)存敏感性或者安全性資料的時(shí)候。你可以設(shè)定讓客戶端變量在某段時(shí)間之后便過(guò)期失效,但是這個(gè)時(shí)間間隔最短只能設(shè)定成一天。如果你儲(chǔ)存的是使用者認(rèn)證相關(guān)資料,你應(yīng)該會(huì)想要讓這段逾期時(shí)間設(shè)定成更短,例如十五分鐘。要做到這項(xiàng)短時(shí)間逾期功能,你只需要多加一些額外的 CFML 程序代碼。
我建立了另一個(gè)稱作 CF_ClientTimeout 的自訂卷標(biāo)來(lái)替你處理這個(gè)問(wèn)題。同樣地,你可以直接在 Allaire 公司的開(kāi)發(fā)情報(bào)交換中心網(wǎng)站上下載使用。這個(gè)卷標(biāo)透過(guò)日期與時(shí)間相關(guān)函數(shù)來(lái)把目前時(shí)間與使用者上一次存取某個(gè)頁(yè)面的時(shí)間加以比對(duì),如果兩者的時(shí)間差距大于你自己設(shè)定的某個(gè)時(shí)間長(zhǎng)度,那么該使用者的相關(guān)信息便會(huì)被視為已經(jīng)逾期并且失去效用。如果你在 applicaiton.cfm 這個(gè)檔案里面使用這個(gè)卷標(biāo),那么這個(gè)卷標(biāo)便會(huì)在同一個(gè)應(yīng)用程序里面的所有頁(yè)面里頭進(jìn)行這項(xiàng)時(shí)間比對(duì)工作。相關(guān)的程序代碼如下:
<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),那么使用者便會(huì)在連續(xù)三十分鐘沒(méi)有作任何動(dòng)作之后,被系統(tǒng)視為已經(jīng)逾期。一旦被系統(tǒng)視為逾期,下一次該使用者試圖再次存取某個(gè)頁(yè)面的時(shí)候,這個(gè)自訂卷標(biāo)便會(huì)傳回 TimeOut 變量的值為「Yes」,你可以使用一個(gè) CFIF 敘述來(lái)判斷這個(gè)變量值,并且將逾期使用者的相關(guān)客戶端變量刪除掉,或者修改某個(gè)認(rèn)證變量的值(例如將 CLIENT.VALIDATED 變量的值設(shè)定成「No」,CLIENT.VALIDATED = "No"),并且接著執(zhí)行一段使用者登入程序。
出處:
責(zé)任編輯:藍(lán)色
上一頁(yè) 為應(yīng)用程序加上安全防護(hù) 下一頁(yè) 善用應(yīng)用程序變量
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|