2012-04-26 31 views
0

美好的一天,使用ColdFusion會議

我們正試圖實現在ColdFusion中8的API,其中未使用的cookies - 相反,我們通過GET或POST爲每個請求通過CFID,CFTOKEN和JSESSIONID。

我們正在使用mach-ii及其SessionFacade。我不知道你是否需要進一步的信息。請提及,如果你這樣做。

在Coldfusion Administrator中,客戶端變量設置爲「Registry」,爲「使用J2EE會話變量,啓用應用程序變量,啓用會話變量」中的每一個勾選了內存變量。

我的Application.cfc僞構造看起來像

<cfset this.name = "#cgi.server_name#" /> 
<cfset this.loginStorage = "session" /> 
<cfset this.sessionManagement = true /> 
<cfset this.setClientCookies = false /> 
<cfset this.setDomainCookies = false /> 
<cfset this.sessionTimeOut = CreateTimeSpan(0,1,0,0) /> 
<cfset this.applicationTimeOut = CreateTimeSpan(0,1,0,0) /> 

,並沒有什麼onSessionStart或onSessionEnd。

爲了驗證會話,我使用的插件,並在其預處理方法,我有:

if (not getSessionFacade().has("authUserLoggedIn")){ 
    arguments.eventContext.clearEventQueue(); 
    arguments.eventContext.announceEvent("nologin", newEventArgs); 
} 

我覺得我不理解的第一件事就是,是否有任何情況下它是必要的在使用J2EE會話時發送cfid和cftoken?或者jsessionid完全完全取代它們的功能?

其次,我希望這一個應用程序(而不是整個服務器)不發送cookie。在我的Application.cfc中,我將Cookie設置爲禁用,但它仍嘗試發送包含jsessionid的cookie。

這有什麼,我認爲是奇怪的副作用:

在Firefox禁用Cookie,然後將CFID,CFTOKEN和JSESSIONID進入URL正確維護會話狀態。

但我們也將它用於接受cookie的iPhone應用程序。在我們通過將cookie保存到本地存儲器來修復它之前,當您關閉應用程序並重新打開它時,cookie會丟失。不管事實上仍然有效的cfid,cftoken和jsessionid是在URL中發送的,它仍然給我們一個「未登錄」的錯誤。

所以我有三個問題:

首先,使用J2EE會話時,在那裏,我需要存儲和重新發送CFID和CFTOKEN的情況?

其次,是否有應用程序級別設置我可以用來強制jsessionid手動存儲,而不是使用cookie?

第三,在哪一個階段是jsessionid拿起和會議變量從內存填充?這是不是我可以調試或詢問,這樣我就可以把事情說

if jsessionid refers to a current, valid session { 
    ... 
} 
+0

關於你最後的問題(第三),這是明確的「onSessionStart()」射擊。當onSessionStart()觸發它意味着事實上你有一個新的jsessionID;大概是空的。 – 2012-04-26 13:06:47

+0

不完全是我的意思 - 我的意思是,在每個請求開始時,當jsessionid從url或cookie中選出時,系統檢查它是否屬於有效會話,並檢索/填充會話數組爲了該請求的目的。 – 2012-04-27 01:40:26

回答

3

此設置:

<cfset this.setClientCookies = false /> 

被設置防止客戶端的cookie(CFID/CFTOKEN)。這與客戶端管理和不是會話管理有關。您沒有在您的屬性中設置clientManagement值,因此它可能默認爲true - 意味着正在創建這些值,但未設置爲cookie。如果你沒有把它們傳遞給URL(我現在正在談論cfid/cftoken),你可能會創建它們。檢查你的註冊表:)作爲一個規則,如果你不使用它們將clientmanagement設置爲false。

CFID和CFTOKEN用於客戶端變量,即使您有jsessionid;啓用。但是在使用jsessionID時,它們不應該用於會話。

在我所瞭解的應用程序屬性中,並沒有等價於setClientCookies。從邏輯上講,我期望看到一個「setSessionCookies =」,這樣你就可以精確控制這些變量。但事實並非如此。我懷疑它可能是因爲CF正在挖掘底層j2ee會話架構,這就是它在底層完成的方式。但不要引用我。

但是,我想知道爲什麼你不只是陷入jsessionID;在onSessionStart()中並根據需要將它傳遞給您的URL。 Cookie可能被設置 - 或者它們可能不是基於所涉及的平臺或客戶端......但只要你在url上擁有它,你就是對的?

+0

感謝您的「clientManagement」關於您的最後一段,如果cookie被接受但後來丟失,即使使用url中的jsessionid,會話仍然失效。我希望完全擺脫會話cookie。可能有辦法破解底層的java並在那裏查詢/修改它? – 2012-04-27 01:29:26

0

此設置:

<cfset this.setClientCookies = false /> 

設置CFID & CFTOKEN或JSESSIONID餅乾。這些用於客戶端和會話!因此,如果您將此設置爲false,並且您不在請求url中放置CFID/CFTOKEN或JSESSIONID,則無法使用會話管理。