我的公司与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。 有什么想法吗?
提前致谢!
答案 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())#">
不断重启的不良服务器也会丢弃会话,但之前的原因可能是最常见的原因......尤其是在共享托管环境中。