ColdFusion忘记1行内的变量

时间:2012-04-22 18:13:05

标签: coldfusion coldfusion-8

我的公司与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:SESSION中未定义元素CHECK。 at coldfusion.runtime.CfJspPage.resolveCanonicalName(CfJspPage.java:1694)at coldfusion.runtime.CfJspPage._resolve(CfJspPage.java:1612)at coldfusion.runtime.CfJspPage._resolveAndAutoscalarize(CfJspPage.java:1747)at coldfusion.runtime。 CfJspPage._resolveAndAutoscalarize(CfJspPage.java:1740)at at   cfindex2ecfm123677868._factor9(C:\ path \ index.cfm:18)at ...

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

我们正在运行ColdFusion 8.0.1.195765。 有什么想法吗?

提前致谢!

4 个答案:

答案 0 :(得分:1)

尝试使用structKeyExists代替isDefined

<cfif NOT structKeyExists(session, 'check') OR 
      session.check IS 0>
    <cfset ok=1>
</cfif>

答案 1 :(得分:1)

这里有两个猜测....首先,你可能会被错误的行号所欺骗。查看第18行 - 在您在堆栈中执行的代码或执行顺序之上。寻找另一个“检查”参考。

同时,这段代码:

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

虽然好......包括“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>

这可以确保代码可以在未更改的会话上运行 - 无法保证可能会遇到会话的其他代码。

答案 2 :(得分: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">  

答案 3 :(得分:0)

检查并确保您的CFApplication名称具有独特性和独特性。最佳实践通常最终散列当前目录以确保这一点,但您也可以尝试添加版本号以确保绝对。 e.g:

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

不断重启的不良服务器也会丢弃会话,但之前的原因可能是最常见的原因......尤其是在共享托管环境中。