2013-06-19 34 views
4

我有一個用的Application.cfc以下設置:的ColdFusion 10 CFCookie沒有履行域屬性

<cfset THIS.Name = "Test01" /> 
<cfset THIS.ApplicationTimeout = CreateTimeSpan(1,0,0,0) /> 
<cfset THIS.sessionTimeout = CreateTimeSpan(1,0,0,0) /> 
<cfset THIS.clientManagement = false /> 
<cfset THIS.SessionManagement = true /> 
<cfset THIS.SetClientCookies = false /> 
<cfset THIS.setDomainCookies = false /> 

我試圖發送以下Cookie:

<cfcookie name="CFID" value="#session.CFID#" domain=".test01.domain.net" path="/" expires="never"> 
<cfcookie name="CFTOKEN" value="#session.CFTOKEN#" domain=".test01.domain.net" path="/" expires="never"> 

然而,什麼被髮送到瀏覽器是:

Set-Cookie: CFID=6389; Domain=.domain.net; Expires=Fri, 12-Jun-2043 22:14:17 GMT; Path=/; HttpOnly: 
Set-Cookie: CFTOKEN=783fa62afecfd571%2DB1069303%2D3048%2D3344%2DAA97ADAF73598FA6; Domain=.domain.net; Expires=Fri, 12-Jun-2043 22:14:17 GMT; Path=/; HttpOnly 

無論我把什麼值放在域或路徑,它總是發送有相同的標題。如果我嘗試使用cfheader,它不會發送任何內容。唯一的一次我能得到它來發送cookie頭沒有域的值是通過設置SetClientCookies爲true:

Set-Cookie: CFID=6391; Expires=Fri, 12-Jun-2043 22:21:38 GMT; Path=/; HttpOnly 

不過,我可以不再會使用StructDelete也不CFCookie與屬性擺脫餅乾現在到期(實際上它創建了第二組Cookie)。

我的主要目標是簡單地發送CFID和CFTOKEN餅乾沒有域(或者至少是不帶前導時間,例如test01.domain.net)

+0

您是否看到過[設置HTTPOnly cookies](http://www.petefreitag.com/item/764.cfm)上的這篇文章?在CF10上,這是在Application.cfc中設置'this.sessioncookie.httponly = true'的問題。 – imthepitts

+0

設置'this.sessioncookie.httponly = true'和'THIS.SetClientCookies = false'時,當name屬性是CFID或CFTOKEN時,CF仍然會忽略任何cfcookie屬性。在CFAdmin中,原始服務器的HTTPOnly設置爲true。 – Alex

+0

請參閱:http://stackoverflow.com/questions/17583768/why-doesnt-cfcookie-allow-setting-domain-to-a-subdomain – Henry

回答

2

感謝亨利在我使用cfheaders接過來一看又通過具有由CF10發送的頭細看使用<cfset this.SetClientCookies = true>時。 CF10省略在發送到瀏覽器的報頭中的域值,所以我複製的頭CF10發送並把它放在一個cfheader:

<cfheader name="Set-Cookie" value="CFID=#session.CFID#; Expires=#GetHttpTimeString(DateAdd("yyyy", 40, Now()))#; Path=/"> 
<cfheader name="Set-Cookie" value="CFToken=#session.CFToken#; Expires=#GetHttpTimeString(DateAdd("yyyy", 40, Now()))#; Path=/"> 

螺」不料瀏覽器接收該cookie不具有超前時段域值。我也設法終止這些Cookie用下面的代碼:

<cfheader name="Set-Cookie" value="CFID=#session.CFID#; Expires=#GetHttpTimeString(Now()-1)#; Path=/"> 
<cfheader name="Set-Cookie" value="CFToken=#session.CFToken#; Expires=#GetHttpTimeString(Now()-1)#; Path=/"> 
<cfset StructClear(session)> 
<cflocation url="/" addtoken="no"> 

唯一的怪癖似乎在使用Chrome瀏覽器的URL變量測試出的代碼塊,Chrome瀏覽器會發送一個HTTP請求時,只需鍵入?ResetSen在地址欄中導致第二個請求時,我按Enter鍵。這會導致諸如跳過CFID(7249 - > 7251)或僅發送兩組cookie(過期時間:無限期和到期時間:現在)等奇怪事件。

沒關係,真正的問題似乎是到期時間沒有過去(兩個請求在同一秒內),我將那部分改爲#GetHttpTimeString(Now()-1)#,這是過去的一天,似乎在等待。

原來這個:

<cfheader name="Set-Cookie" value="CFID=#session.CFID#; Domain=test01.domain.net;Expires=Sat, 04-Jul-2043 13:24:38 GMT; Path=/"> 
<cfheader name="Set-Cookie" value="CFToken=#session.CFToken#; Expires=Sat, 04-Jul-2043 13:24:38 GMT; Path=/"> 

發送此:

Set-Cookie: CFID=7191; Domain=test01.domain.net; Expires=Sat, 04-Jul-2043 13:24:38 GMT; Path=/ 
Set-Cookie: CFToken=33b984d7a56f6356-0B97F3CF-3048-3344-AABF2B698F4B8B02; Domain=test01.domain.net; Expires=Sat, 04-Jul-2043 13:24:38 GMT; Path=/ 

哪個瀏覽器收到的.test01.domain.net這正是我想避免的。

-1

爲了修改會話Cookie在你的代碼應該在你的Application.cfc僞構造函數添加以下內容:

<cfset this.sessioncookie.disableupdate = false> 

這也可以在下面的CF管理員的「內存變量」部分服務器級別控制。

+0

沒有骰子,CF10劫持該命令併發送相同的舊cookie標頭。我鬆了一口氣,決定以另一種方式(在會話而不是cookies)看待我最初的問題,並簡單地銷燬會話('StructClear(session)'),並讓CF10將CFID/CFTOKEN分配給新創建的會話範圍。 – Alex