Session 为什么ColdFusion会话变量是;“未定义”;在被引用几行之前?
在Windows2003/IIS6上运行ColdFusion 8.01标准 Application.cfc:Session 为什么ColdFusion会话变量是;“未定义”;在被引用几行之前?,session,coldfusion,coldfusion-8,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 = CreateT
<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>
THIS.SessionManagement=“是”;
THIS.SessionTimeout=CreateTimeSpan(0,3,0,0);
THIS.ApplicationTimeout=CreateTimeSpan(0,8,0,0);
如果(!StructKeyExists(会话,“用户”))
SESSION.User=CreateObject(“组件”、“cfc.User”);
模板文件伪代码示例:
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]);
}
LOCAL.qItems=
CreateObject(
“组成部分”,
“cfc.项目”
).setUser(SESSION.User).getItems();
对于(i=1;i,这很可能是由于代码中的其他内容清除了会话范围或为session.User
分配了NULL而导致的线程安全问题
我建议您这样做,因为您的循环中似乎没有I
的本地声明,所以代码不是线程安全的-因此您的代码中的其他地方可能会有类似的错误。我将把这一行“SESSION.User=CreateObject(“component”,“cfc.User”);”放在onSessionStart()中然后,它将在每个用户会话首次启动时运行。不确定您的问题是什么,但您确实应该在onSessionStart()
而不是onRequestStart()中初始化会话变量
。可能有些用户在您的站点中使用多个选项卡/窗口,可能一个选项卡正在执行某些操作,但他们在另一个选项卡中注销,从而破坏了您的会话变量。或者,可能在他们在一个选项卡中注销后,他们会返回到上一个选项卡并尝试某种操作。在我的CF应用中,如果用户注销了所有其他选项卡,则会强制退出同时注销并返回登录页面。因此,只需在for循环之前添加“i=1;”即可使这段代码线程安全?不,您需要在循环之前执行“var i=”“”或“local.i=”“”来生成“i”函数的局部变量,因此线程安全。因为您使用的是CF8,所以必须使用var i=
。局部作用域是在CF 9中引入的。它不是一个函数,而是CFM模板中的一段cfscript-事实上是根目录中的默认模板。因此,不确定简单索引的范围将导致我的会话被清除?如何清除该CFM模板是否已执行?是否作为CFC的一部分?只是通过URL直接调用的普通CFM模板?是否有可能在同一个会话中运行多个请求,其中一个请求正在从会话范围中删除用户?这将如何解决会话(或会话属性)的问题消失在模板加载的中间?