1

我的公司与 ColdFusion 合作,并且多年来在不同的变体中遇到了这个问题。是时候解决它了。

场景非常简单:

<cfparam name="session.check" default="0">
<cfif NOT isDefined('session.check') OR 
      session.check IS 0>
    <cfset ok=1>
</cfif>

现在 ColdFusion 抛出一个错误:

SESSION 中未定义元素 CHECK。错误发生在第 18 行。

对于那些可以从中读取内容的人,这里是详细的堆栈跟踪:

Coldfusion.runtime.UndefinedElementException:元素检查在会话中未定义。在coldfusion.runtime.CfJspPage.resolveCanonicalName(CfJspPage.java:1694) 在coldfusion.runtime.CfJspPage._resolve(CfJspPage.java:1612) 在coldfusion.runtime.CfJspPage._resolveAndAutoscalarize(CfJspPage.java:1747) 在coldfusion.runtime。 CfJspPage._resolveAndAutoscalarize(CfJspPage.java:1740) 在 cfindex2ecfm123677868._factor9(C:\path\index.cfm:18) 在 ...

如果使用 cfparam 或者只是一个 cfset 并不重要。此外,这不是一个简化的示例,这个错误发生在我们的服务器上。在设置和读取的变量之间没有单行。

我们正在运行 ColdFusion 8.0.1.195765。有任何想法吗?

提前致谢!

4

4 回答 4

1

尝试使用structKeyExists而不是isDefined

<cfif NOT structKeyExists(session, 'check') OR 
      session.check IS 0>
    <cfset ok=1>
</cfif>
于 2012-04-22T19:33:49.180 回答
1

这里有 2 个猜测.... 首先,您可能会被错误的行号所迷惑。查看第 18 行上方 - 在您粘贴到堆栈或执行顺序中的代码上方。寻找另一个“检查”参考。

同时,这段代码:

<cfparam name="session.check" default="0">
<cfif NOT isDefined('session.check') OR 
      session.check IS 0>
    <cfset ok=1>
</cfif>

虽然 ok... 包括 "NOT isDefined('session.check')" ... 考虑到它前面的 cfparam 是多余的。Cfparam 应保证var 存在,因此您不需要“isDefined”。我猜它是因为错误而被放入的。

猜数字 2

根据应用程序,这也可能是某种竞争问题——尤其是在使用帧或 ajax 时。尝试在会话范围内使用 CFLOCK 将代码括起来:

<cflock scope="session" timeout="4">
   <cfparam name="session.check" default="0">
   <cfif NOT isDefined('session.check') OR 
         session.check IS 0>
       <cfset ok=1>
   </cfif>
</cflock>

这将确保代码将在未更改的会话上运行 - 不保证可能会命中该会话的其他代码。

于 2012-04-23T14:45:36.187 回答
0

您是否需要声明会话超时?这一次在 12 小时内超时...

 <!--- Create the application --->
 <cfapplication name="MyApp" clientmanagement="Yes"
                sessionmanagement="Yes"
                sessiontimeout="#CreateTimeSpan(0,12,0,0)#"
                applicationtimeout="#CreateTimeSpan(0,12,0,0)#">
        <!--- 
        #CreateTimeSpan(days,hours,minutes,seconds)#
        --->

 <cfparam name="session.check" default="0">  
于 2012-04-22T18:46:47.123 回答
0

检查并确保您的 CFApplication 名称是唯一且独特的。最佳实践通常最终会散列当前目录以确保这一点,但您也可以尝试添加版本号以绝对确定。例如:

<CFAPPLICATION name="myApp_0001_#hash(getCurrentTemplatePath())#">

不断重启的问题服务器也可能会丢失会话,但前面的原因可能是最常见的原因……尤其是在共享托管环境中。

于 2012-04-23T18:02:00.977 回答