考虑ColdFusion 9网站的以下结构:
/root
..../MyApp
........../Application.cfc
........../Index.cfm
..../SharedComponents
........../Common.cfc
在common.cfc中包含我希望在root下的多个应用程序之间共享的所有常用功能。
其中一个功能允许我动态创建会话名称并分配值。
<cffunction name="CreateSession" access="remote" returntype="any">
<cfargument name="strSessionName" required="yes" type="string">
<cfargument name="strSessionValue" required="yes" type="string">
<cfset Session["#strSessionName#"] = "#strSessionValue#" />
</cffunction>
我通过AJAX调用此函数,因为我希望在JavaScript进程之后创建此会话。
这是我在ColdFusion中使用的表达式,然后将其呈现为实际的URL,然后通过AJAX 调用。
"#Application.Protocol & "://" & CGI.SERVER_NAME#/SharedComponents/common.cfc?method=CreateSession&strSessionName=TestSessionName&strSessionValue=TestValue"
但是,当尝试在Index.cfm上显示这个新创建的会话时,没有显示任何内容。
我尝试将common.cfc重新定位到MyApp文件夹中,修改ColdFusion表达式路径(如上所示)以反映新路径,并且它没有问题。
这让我相信我无法通过应用程序范围之外的函数设置会话(即MyApp文件夹,其中找到Application.cfc)
我的问题是,有没有办法调用应用程序范围之外的函数,它仍然可以管理应用程序的会话?
答案 0 :(得分:1)
这让我相信我无法通过应用程序范围之外的函数设置会话(即MyApp文件夹,其中找到Application.cfc)
使用您的文件夹结构,您有两个ColdFusion应用程序。您在MyApp文件夹中有一个应用程序,在SharedComponents文件夹所属的根文件夹中有一个应用程序。除非您选择对share a session between applications使用一些hackish步骤,否则所有应用程序都会为用户提供唯一的会话范围。我不建议像这样分享会议。如果您需要在一个网站中的所有应用程序之间共享一个会话范围,我会重新评估您有多个应用程序的原因。
在您的示例中,您让客户端直接向sharedComponents文件夹中的远程函数发出请求。组件可用的会话范围与MyApp应用程序可用的会话范围不同。
在所有应用程序中共享公共代码的一种方法是在存储共享代码的位置设置mapping。创建到共享编码的映射后,您将能够扩展共享组件,或创建包装器以公开共享代码。这是两个剂量的例子。我已经选择将这个新组件(所谓的Common)放入MyApp的根目录中,并且我已经调用了我的映射&#39; mapToSharedComponents&#39;。
component extends="mapToSharedComponents.Common"
{
remote function wrappedCall(key, value){
local.common = new mapToSharedComponents.Common();
common.CreateSession(key,value);
}
}
http://localhost/MyApp/common.cfc?method=CreateSession&strSessionName=inherited&strSessionValue=test
http://localhost/MyApp/common.cfc?method=wrappedCall&key=wrapped&value=test
这两个调用将在调用用户的MyApp会话范围中创建新的键值对。第一个调用从现有组件调用继承的CreateSession函数。对新的wrappedCall函数的调用会创建原始组件的新实例,并使用传递的参数调用CreateSession函数。
如果您的所有应用程序都在同一个网站中,则可以跳过映射并从Web根目录引用该组件。您仍然需要一个属于子文件夹应用程序的组件。在这种情况下,示例组件如下所示:
component extends="SharedComponents.Common"
{
remote function wrappedCall(key, value){
local.common = new SharedComponents.Common();
common.CreateSession(key,value);
}
}