Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 为什么ColdFusion会话变量是;“未定义”;在被引用几行之前?_Session_Coldfusion_Coldfusion 8 - Fatal编程技术网

Session 为什么ColdFusion会话变量是;“未定义”;在被引用几行之前?

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

在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>

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模板?是否有可能在同一个会话中运行多个请求,其中一个请求正在从会话范围中删除用户?这将如何解决会话(或会话属性)的问题消失在模板加载的中间?