为什么在引用几行之后,ColdFusion SESSION变量“未定义”?

时间:2014-01-15 16:52:29

标签: session coldfusion coldfusion-8

在Windows2003 / IIS6上运行ColdFusion 8.01标准

的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]);
    }

onRequestStart()的{​​{1}}中设置了SESSION.User(如果尚未定义)。上面的代码在模板文件中运行。对Application.cfc的第二次引用引发了消息SESSION.User的异常。

为什么SESSION.User会被定义(不抛出异常)前几行,然后在几行之后(几毫秒内)抛出此异常?

在整个申请过程中,这可能每天在不同的模板中发生一次。

我该如何防止这种情况?

2 个答案:

答案 0 :(得分:7)

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

我建议你因为你的循环中似乎没有i的本地声明,所以代码不是线程安全的 - 所以你的代码中的其他地方可能会有类似的错误。

答案 1 :(得分:1)

我把这行放在“SESSION.User = CreateObject(”component“,”cfc.User“);”进入onSessionStart()然后它将在首次启动每个用户会话时运行。