2014-01-15 50 views
4

Windows2003上運行ColdFusion 8.01標準/ IIS6爲什麼在引用幾行之前ColdFusion SESSION變量「undefined」?

的Application.cfc:

<cfcomponent output="false"> 
    <cfscript> 
     THIS.SessionManagement = "Yes"; 
     THIS.SessionTimeout = CreateTimeSpan(0, 3, 0, 0); 
     THIS.ApplicationTimeout = CreateTimeSpan(0, 8, 0, 0); 
    </cfscript> 

    <cffunction name="onRequestStart" returnType="Boolean" output="false"> 
     <cfargument name="targetPage" type="string" required="true"> 

     <cfscript> 
      if (!StructKeyExists(SESSION, "User")) 
       SESSION.User = CreateObject("component", "cfc.User"); 
     </cfscript> 
    </cffunction> 
</cfcomponent> 

模板文件僞代碼示例:

LOCAL.qItems = 
     CreateObject(
       "component", 
       "cfc.Items" 
       ).setUser(SESSION.User).getItems(); 

    for (i=1; i<=LOCAL.qItems.RECORDCOUNT; i++) { 
     LOCAL.Item = 
      CreateObject(
       "component", 
       "cfc.Item" 
       ).setUser(
        SESSION.User 
        ).setId(LOCAL.qItems["Sku"][i]); 
    } 

SESSION.User設置(如果尚未定義)的onRequestStart()。上面的代碼在模板文件中運行。對SESSION.User的第二個引用引發了一個異常,消息Element USER is undefined in SESSION

爲什麼會在幾行之前定義SESSION.User(不拋出異常),然後在幾行之後拋出這個異常(毫秒)?

在我的應用程序中,這種情況可能每天發生在不同的模板中。

我該如何預防?

+3

不知道你的問題是什麼,但你應該在'onSessionStart()'而不是'onRequestStart()'中啓動你的會話變量。 –

+0

也許有些用戶正在使用多個標籤頁/窗口在您的網站上工作,也許一個標籤頁正在做某件事,但之後他們會在另一個標籤頁中註銷,從而破壞您的會話變量。或者,也許在他們退出一個標籤之後,他們會回到前一個標籤並嘗試某種行動。在我的CF應用程序中,如果用戶註銷,則所有其他選項卡也必須退出並返回到登錄頁面。 – gfrobenius

回答

7

這很可能是一個線程安全問題,在代碼中的其他內容中清除會話範圍或將NULL分配給SESSION.User

我建議,因爲您的循環中似乎沒有針對i的本地聲明,因此代碼不是線程安全的 - 因此您的代碼中的其他位置可能存在類似的錯誤。

+0

所以簡單地加上「i = 1;」 for循環之前會使這段代碼線程安全嗎? –

+0

不,您可能需要在循環之前執行'var i =「」'或'local.i =「」',以使「i」變量局部於函數中,從而保證線程安全。 –

+2

既然你在CF8上,你必須使用'var i ='。本地作用域引入CF 9 –

1

我把這一行「SESSION.User = CreateObject(」component「,」cfc.User「);」到onSessionStart(),然後它將在每個用戶會話首次啓動時運行。

+0

這將如何解決我的SESSION(或SESSION屬性)問題在模板加載中消失? –