Session ColdFusion会话作用域是否持久化到应用程序?

Session ColdFusion会话作用域是否持久化到应用程序?,session,coldfusion,coldfusion-9,cfc,Session,Coldfusion,Coldfusion 9,Cfc,考虑ColdFusion 9网站的以下结构: /root ..../MyApp ........../Application.cfc ........../Index.cfm ..../SharedComponents ........../Common.cfc 在common.cfc中包含我希望在root下的多个应用程序之间共享的所有通用函数 其中一个函数允许我动态创建会话名称并分配值 <cffunction name="CreateSession" access="remote

考虑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>
但是,当尝试在Index.cfm上显示这个新创建的会话时,没有显示任何内容

我尝试将common.cfc重新定位到文件夹MyApp中,修改ColdFusion表达式路径(如上图所示)以反映新的路径,结果没有问题

这让我相信,我无法从我的应用程序范围之外的函数(即MyApp文件夹,application.cfc所在的位置)设置会话

我的问题是,是否有方法调用应用程序范围之外的函数,该函数仍然可以管理应用程序的会话

这让我相信,我无法从我的应用程序范围之外的函数(即MyApp文件夹,application.cfc所在的位置)设置会话

使用文件夹结构,您有两个ColdFusion应用程序。您在MyApp文件夹中有一个应用程序,在SharedComponents文件夹所属的根文件夹中也有一个应用程序。除非您选择使用一些骇人的步骤,否则所有应用程序对用户都有唯一的会话范围。我不建议像这样分享课程。如果您需要在一个网站中的所有应用程序之间共享一个会话范围,我将重新评估为什么您有多个应用程序

在您的示例中,您让客户端直接向sharedComponents文件夹中的远程函数发出请求。组件可用的会话范围与MyApp应用程序可用的会话范围不同

在所有应用程序中共享公共代码的一种方法是在存储共享代码的位置设置一个。一旦创建了到共享代码的映射,就可以扩展共享组件,或者创建一个包装器来公开共享代码。这是一个两者都适用的例子。我选择了将这个新组件(都称为Common)放入MyApp的根目录中,并将我的映射称为“mapToSharedComponents”

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);
    }
}

会话与用户绑定<代码>会话[“#strSessionName#”]实际上并不创建会话名称。它在用户会话中创建具有特定名称的变量。如果您想在应用程序范围之外共享某些东西,您可能需要考虑服务器范围。会话本质上与应用程序绑定。如果Application.cfc/cfm没有覆盖一个文件,那么就没有会话。也许他在尝试单点登录之类的事情?在这种情况下,还有其他方法可以实现这一点。映射方法很常见,但也可能存在问题。并不是说我不推荐它,只是请注意,我只会在一个通用组件中使用非常通用的函数类型方法。我们让一个程序员使用这种共享函数的映射风格,但函数有时是特定于应用程序的。它不仅变得臃肿,而且后来有人改变了一个函数,不知道它在哪里被使用。我不喜欢与其他应用程序共享自定义项。
component extends="SharedComponents.Common"
{
    remote function wrappedCall(key, value){
        local.common = new SharedComponents.Common();
        common.CreateSession(key,value);
    }
}