为什么 ColdFusion SESSION 变量在之前被引用了几行后"undefined"?



在Windows2003/IIS6上运行ColdFusion 8.01 Standard

应用.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]);
    }

会期。在Application.cfc onRequestStart()中设置了用户(如果尚未定义)。上面的代码在模板文件中运行。对 SESSION.User 的第二个引用抛出了消息 Element USER is undefined in SESSION 的异常。

为什么会会话。用户在几行之前被定义(不抛出异常),然后在几行之后(毫秒内)抛出这个异常?

在我的整个应用程序中,这可能每天在不同的模板中发生一次。

我该如何防止这种情况?

这很可能是线程安全问题,代码中的其他内容清除了会话范围或将 NULL 分配给SESSION.User

我建议这样做,因为您的循环中似乎没有i的本地声明,因此代码不是线程安全的 - 因此您可能会在代码中的其他地方遇到类似的错误。

我会把这一行"会话。User = CreateObject("component", "cfc.User");" 放入 onSessionStart() 中,它将在每个用户会话首次启动时运行。

最新更新