ColdFusion 11:“变量 SESSION 未定义”错误
ColdFusion 11: " Variable SESSION is undefined" Error
问题
我刚刚在我的计算机上安装了 ColdFusion 11 Developer Edition 以使我的 LocalHost 环境与我们最近升级的开发和生产环境相匹配。
但是现在,在其他地方都可以使用的相同代码在新安装上却失败了——具体来说:
- 以前的 ColdFusion 9 LocalHost(我正在尝试用新安装替换它):代码有效。
- ColdFusion 11 开发和生产环境:代码有效。
- 新的 ColdFusion 11 LocalHost: 代码失败并出现 "Variable SESSION is undefined" 错误。
尝试过的解决方案无效
尝试在我们的开发和生产服务器中完成的工作
我们的服务器管理员在 12 月份将 ColdFusion 9 升级到 11 时也发生了这个错误,所以我联系了他,了解他是如何解决的。不过,一个显着的区别是他使用 Apache Web 服务器在 Linux 机器上安装,而我使用 ColdFusion 11 Developer Edition 的内置 Web 服务器在 Windows 7 计算机上安装.
无论如何,他告诉我他已经做了两个更改来解决他系统上的这个错误:
- 在 ColdFusion Administrator 中,确保启用所有内存变量。
**我这样做了,检查了以下内容,然后单击提交更改:
- 使用 J2EE 会话变量
- 启用应用程序变量(已选中)
- 启用会话变量(已选中)**
- 在 Apache
global.conf
文件中,添加以下行:
RewriteEngine on
RewriteRule .* - [E=REMOTE_USER:%{REMOTE_USER}]
RewriteRule .* - [E=SCRIPT_NAME:%{REQUEST_URI}]
RewriteRule .* - [E=AUTHENTICATE_CN:%{ENV:AUTHENTICATE_CN}]
RewriteRule .* - [E=AUTHENTICATE_DEPARTMENTNUMBER:%{ENV:AUTHENTICATE_DEPARTMENTNUMBER}]
RewriteRule .* - [E=AUTHENTICATE_GIVENNAME:%{ENV:AUTHENTICATE_GIVENNAME}]
RewriteRule .* - [E=AUTHENTICATE_MAILALTERNATEADDRESS:%{ENV:AUTHENTICATE_MAILALTERNATEADDRESS}]
RewriteRule .* - [E=AUTHENTICATE_MAIL:%{ENV:AUTHENTICATE_MAIL}]
RewriteRule .* - [E=AUTHENTICATE_ORGANIZATIONALSTATUS:%{ENV:AUTHENTICATE_ORGANIZATIONALSTATUS}]
RewriteRule .* - [E=AUTHENTICATE_SERIALNUMBER:%{ENV:AUTHENTICATE_SERIALNUMBER}]
RewriteRule .* - [E=AUTHENTICATE_SN:%{ENV:AUTHENTICATE_SN}]
RewriteRule .* - [E=AUTHENTICATE_TELEPHONENUMBER:%{ENV:AUTHENTICATE_TELEPHONENUMBER}]
RewriteRule .* - [E=AUTHENTICATE_UID:%{ENV:AUTHENTICATE_UID}]
不过我认为这不适合我,因为我正在使用内置 Web 服务器进行此开发安装,并且在我的安装中没有看到 global.conf
文件。
Web 搜索:在 Application.cfc
中添加设置
网络搜索效率不高,但确实让我找到了 very old instruction for ColdFusion 8。根据那篇文章,我尝试将以下行添加到我的 Application.cfc
文件中——但这并没有解决错误:
<cfset this.sessionManagement = "Yes" >
<cfset this.name = "ApplicationName" >
Stack Overflow 上的类似答案
我在 Stack Overflow 上搜索了类似的问题,但没有找到任何有希望的线索。我 found one similar question here,但那个人似乎遇到了与我遇到的问题不同的问题:在他的情况下,SESSION
变量存在(正如他可以用 <cfdump>
证明的那样,但被忽略了稍后在代码中。但在我的例子中,SESSION
变量似乎并没有首先创建。
我确实尝试了那里的建议之一,但是:将以下内容添加到onSessionStart()
:
SESSION.User = CreateObject("component", "cfc.User");
很遗憾,这并没有解决问题。
怀疑
我怀疑问题的症结在于我对内置服务器的使用,并且我必须像我们的服务器管理员对 Apache global.conf
文件所做的那样向配置文件中的某处添加行。
有什么想法可以让我的代码在这个本地 ColdFusion 11 安装上运行吗?
更新:决议
最终,问题的原因是配置问题(加上有缺陷的程序设计):
在 OnApplicationStart()
函数中,有一个对数据库的调用,但失败了,因为我忽略了在这个新安装上安装适当的 JAR
文件。这将程序执行发送到 OnError()
函数。在我们的例子中,OnError()
函数在其报告中包含来自 SESSION
变量的一些信息——但是因为程序执行从未完成 OnApplicationStart()
函数,因此它从未进入 OnSessionStart()
创建 SESSION
变量的函数。这导致了 "Variable SESSION is undefined" 错误。
我对 Kris 的回答投了赞成票并将其标记为正确。 (对于新用户,Kris,干得好!)
确定是安装问题还是代码问题,继续进行故障排除。我会尝试使用 CF 服务器配置工具在 Apache 中创建一个新站点,然后在 CFB 中创建一个新项目。创建一个 Application.cfc 文件和 index.cfm。在 Application.cfc 中确保你有 this.sessionManagement = true
和 this.clientManagement = true
。在 index.cfm 中只是 cfdump
会话。如果成功,您可以进一步查看现有代码。如果失败,您可能想尝试重新安装 CF。
如果您不小心将 CFAdmin 中会话变量的超时参数设置为 0,也会发生这种情况。它不会是无限的,它会使会话范围消失。
问题
我刚刚在我的计算机上安装了 ColdFusion 11 Developer Edition 以使我的 LocalHost 环境与我们最近升级的开发和生产环境相匹配。
但是现在,在其他地方都可以使用的相同代码在新安装上却失败了——具体来说:
- 以前的 ColdFusion 9 LocalHost(我正在尝试用新安装替换它):代码有效。
- ColdFusion 11 开发和生产环境:代码有效。
- 新的 ColdFusion 11 LocalHost: 代码失败并出现 "Variable SESSION is undefined" 错误。
尝试过的解决方案无效
尝试在我们的开发和生产服务器中完成的工作
我们的服务器管理员在 12 月份将 ColdFusion 9 升级到 11 时也发生了这个错误,所以我联系了他,了解他是如何解决的。不过,一个显着的区别是他使用 Apache Web 服务器在 Linux 机器上安装,而我使用 ColdFusion 11 Developer Edition 的内置 Web 服务器在 Windows 7 计算机上安装.
无论如何,他告诉我他已经做了两个更改来解决他系统上的这个错误:
- 在 ColdFusion Administrator 中,确保启用所有内存变量。
**我这样做了,检查了以下内容,然后单击提交更改:- 使用 J2EE 会话变量
- 启用应用程序变量(已选中)
- 启用会话变量(已选中)**
- 在 Apache
global.conf
文件中,添加以下行:
RewriteEngine on
RewriteRule .* - [E=REMOTE_USER:%{REMOTE_USER}]
RewriteRule .* - [E=SCRIPT_NAME:%{REQUEST_URI}]
RewriteRule .* - [E=AUTHENTICATE_CN:%{ENV:AUTHENTICATE_CN}]
RewriteRule .* - [E=AUTHENTICATE_DEPARTMENTNUMBER:%{ENV:AUTHENTICATE_DEPARTMENTNUMBER}]
RewriteRule .* - [E=AUTHENTICATE_GIVENNAME:%{ENV:AUTHENTICATE_GIVENNAME}]
RewriteRule .* - [E=AUTHENTICATE_MAILALTERNATEADDRESS:%{ENV:AUTHENTICATE_MAILALTERNATEADDRESS}]
RewriteRule .* - [E=AUTHENTICATE_MAIL:%{ENV:AUTHENTICATE_MAIL}]
RewriteRule .* - [E=AUTHENTICATE_ORGANIZATIONALSTATUS:%{ENV:AUTHENTICATE_ORGANIZATIONALSTATUS}]
RewriteRule .* - [E=AUTHENTICATE_SERIALNUMBER:%{ENV:AUTHENTICATE_SERIALNUMBER}]
RewriteRule .* - [E=AUTHENTICATE_SN:%{ENV:AUTHENTICATE_SN}]
RewriteRule .* - [E=AUTHENTICATE_TELEPHONENUMBER:%{ENV:AUTHENTICATE_TELEPHONENUMBER}]
RewriteRule .* - [E=AUTHENTICATE_UID:%{ENV:AUTHENTICATE_UID}]
不过我认为这不适合我,因为我正在使用内置 Web 服务器进行此开发安装,并且在我的安装中没有看到global.conf
文件。
Web 搜索:在 Application.cfc
中添加设置
网络搜索效率不高,但确实让我找到了 very old instruction for ColdFusion 8。根据那篇文章,我尝试将以下行添加到我的 Application.cfc
文件中——但这并没有解决错误:
<cfset this.sessionManagement = "Yes" >
<cfset this.name = "ApplicationName" >
Stack Overflow 上的类似答案
我在 Stack Overflow 上搜索了类似的问题,但没有找到任何有希望的线索。我 found one similar question here,但那个人似乎遇到了与我遇到的问题不同的问题:在他的情况下,SESSION
变量存在(正如他可以用 <cfdump>
证明的那样,但被忽略了稍后在代码中。但在我的例子中,SESSION
变量似乎并没有首先创建。
我确实尝试了那里的建议之一,但是:将以下内容添加到onSessionStart()
:
SESSION.User = CreateObject("component", "cfc.User");
很遗憾,这并没有解决问题。
怀疑
我怀疑问题的症结在于我对内置服务器的使用,并且我必须像我们的服务器管理员对 Apache global.conf
文件所做的那样向配置文件中的某处添加行。
有什么想法可以让我的代码在这个本地 ColdFusion 11 安装上运行吗?
更新:决议
最终,问题的原因是配置问题(加上有缺陷的程序设计):
在 OnApplicationStart()
函数中,有一个对数据库的调用,但失败了,因为我忽略了在这个新安装上安装适当的 JAR
文件。这将程序执行发送到 OnError()
函数。在我们的例子中,OnError()
函数在其报告中包含来自 SESSION
变量的一些信息——但是因为程序执行从未完成 OnApplicationStart()
函数,因此它从未进入 OnSessionStart()
创建 SESSION
变量的函数。这导致了 "Variable SESSION is undefined" 错误。
我对 Kris 的回答投了赞成票并将其标记为正确。 (对于新用户,Kris,干得好!)
确定是安装问题还是代码问题,继续进行故障排除。我会尝试使用 CF 服务器配置工具在 Apache 中创建一个新站点,然后在 CFB 中创建一个新项目。创建一个 Application.cfc 文件和 index.cfm。在 Application.cfc 中确保你有 this.sessionManagement = true
和 this.clientManagement = true
。在 index.cfm 中只是 cfdump
会话。如果成功,您可以进一步查看现有代码。如果失败,您可能想尝试重新安装 CF。
如果您不小心将 CFAdmin 中会话变量的超时参数设置为 0,也会发生这种情况。它不会是无限的,它会使会话范围消失。