在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() 中,它将在每个用户会话首次启动时运行。