2011年12月27日 星期二

在CFSCRIPT下使用Cookie

Coldfusion繼續來玩Cookie吧,

注意下面的操作可能需要CF9以上的版本,Railo 3.3 以上的版本執行上沒有問題。

繼上一篇 Using cookie in CFML 之後,如果想在 Cfscript 中使用cookie的操作要怎麼辦?

目前尋遍 adobe 官方文件得到的結果是:
Direct assignment of Cookie scope memory-only variables. You cannot use direct assignment to set persistent cookies that are stored on the user's system.
真是沒輒!!

但是還是有辦法操作的,就是利用 cf-tag 與 cfscript 混用:

首先,寫一段處理 cookie 的 Function :

<cffunction name="setCookie" access="public" returnType="void" output="false">
 <cfargument name="name" type="string" required="true">
 <cfargument name="value" type="string" required="false">
 <cfargument name="expires" type="any" required="false">
 <cfargument name="domain" type="string" required="false">
 <cfargument name="httpOnly" type="boolean" required="false">
 <cfargument name="path" type="string" required="false">
 <cfargument name="secure" type="boolean" required="false">
 <cfset var args = {}>
 <cfset var arg = "">
 <cfloop item="arg" collection="#arguments#">
    <cfif not isNull(arguments[arg])>
        <cfset args[arg] = arguments[arg]>
    </cfif>
 </cfloop>
 <cfcookie attributecollection="#args#">
</cffunction>




然後,在 cfscript 中呼叫這個 Function 替你完成 處理 Cookie 的工作。

<cfscript>
  <!--- 檢查並讀取cookie變數 --->
  if(!structKeyExists(cookie, "hitcount")) hcnt = cookie.hitcount;
  <!--- 設定cookie變數 --->
  setCookie("hitcount",0);
  setCookie("hitcount", ++cookie.hitcount);
  <!--- 包含設定cookie變數的生存期的用法 --->
  setCookie("foreverknight",createUUID(),"never");
  <!--- 顯示cookie --->
  dump(cookie);
  <!--- 刪除cookie --->
  setCookie("foreverknight","","now");
</cfscript>


當然 cookie 如同一般結構變數也可以直接操作他的值,只是這種操作法就無法設定 cookie 變數的屬性,而且該 cookie 變數生命週期為 session:

<cfscript>
  <!--- 並設定cookie變數(該變數不存在時會建立) --->
  cookie.hitcount = 0;
  cookie.foreverknight = createUUID();
</cfscript>


上面提到的 Function 是和 cfscript 程式片斷放在同一個 page 上執行的,

如果是把 Function 放在.CFC 元件庫,記得要先建立元件庫物件才可以呼叫喔。

參考來源:how to set expiration date on a cookie in cfscriptSettings cookies (with expiration, etc) in CFScript

0 個回應: