Session 如何在服务器上/同一域下的多个ColdFusion应用程序之间共享会话?

Session 如何在服务器上/同一域下的多个ColdFusion应用程序之间共享会话?,session,coldfusion,scope,session-state,session-cookies,Session,Coldfusion,Scope,Session State,Session Cookies,假设我有一个域名sub.domain.com,其中有一个登录表单 在根目录中,我有我的Application.cfc,它使用THIS.Name=“MyApp”命名应用程序 我在这个网站上有几个子目录,我想作为单独的应用程序运行,它们有自己的Application.cfc,它扩展了根Application.cfc,但每个子目录都有自己的名称,因此我可以创建该应用程序特有的应用程序范围变量: 例如:sub.domain.com/site1/Application.cfc 扩展sub.domain.c

假设我有一个域名sub.domain.com,其中有一个登录表单

在根目录中,我有我的Application.cfc,它使用
THIS.Name=“MyApp”命名应用程序

我在这个网站上有几个子目录,我想作为单独的应用程序运行,它们有自己的Application.cfc,它扩展了根Application.cfc,但每个子目录都有自己的名称,因此我可以创建该应用程序特有的应用程序范围变量:

例如:sub.domain.com/site1/Application.cfc

扩展sub.domain.com/Application.cfc(使用代理cfc)
THIS.Name=“MyApp\u Site1”

并设置特定于应用程序的一些应用程序范围变量

但是,当他们在登录时,在那里设置的任何会话范围变量都与应用程序名“MyApp”关联


我可以使用什么样的解决方案来接受根目录应用程序中的有效登录,然后将用户转发到其应用程序,同时保留其用户特定的属性?

ColdFusion中的会话与特定的应用程序相关联。您不能在使用ColdFusion中的会话结构的应用程序之间共享它们。(想象一下,如果您可以从同一台服务器上的任何应用程序中提取会话信息,那么在共享主机上会有一场安全噩梦。)


当客户成功登录到应用程序的根目录时,您需要将会话信息存储在数据库或其他一些持久性机制中,然后在向特定于站点的应用程序发出第一个请求时加载客户的会话信息。您可以在特定于站点的应用程序的application.cfc中的onSessionStart()中执行此操作,甚至可以在onRequestStart()中执行此操作。

简单的答案是您不能。但让我解释一下,这也不完全正确。首先,会话与应用程序名称绑定。因此,如果您有两个application.cfc文件,它们都具有相同的应用程序名称,那么会话将对这两个文件都可用。然而,这不是你正在做的。由于每个会话都有不同的名称,因此每个会话都会有新的应用程序作用域,因此也会有新的会话

您可能希望尝试使用FW\1和子应用程序。这将为您提供一个单一的主app.cfc,但允许您将功能划分为不同的组


您还可以从登录页面设置域级cookie。然后,您可以在其他应用程序中使用它们来盲目创建会话。

正如@Dave Ferguson提到的,共享会话数据的最简单、最冷的方法是将其作为单个应用程序保存。您甚至可以将内容放在不同的文件夹中,只要名称相同

您不需要使用像FW\1或类似的框架来获得所需的内容,尽管它们可能会使它变得更简单。您可以始终在应用程序范围内存储结构,键是子应用程序名称。例如,application.myvariable可以是application[request.subappname].myvariable。这使您只需使用一个应用程序,但应用程序变量的作用域为各个子应用程序。您也可以对会话变量执行同样的操作

正如@Brian提到的,另一种方法是使用中间存储。然后,您可以使用所需的任何密钥存储会话数据。正如@Dave Ferguson提到的,将您的CFID和CFTOKEN设置为域cookie(尤其是CF10在这方面有一些改进)。这样,相同的CFID和CFTOKEN将在应用程序中使用。它们仍然有不同的会话,但使用相同的会话标识符。然后,您可以使用该组合作为中间存储中数据的密钥

数据库是实现这一点的常规方法,但这可能会导致并发和锁定问题、序列化/反序列化问题或性能问题,然后总是要处理旧数据/过期数据的清除。所以你可能想调查或处理这件事

ehcache尤其是一个有吸引力的选项,因为它与ColdFusion 9+捆绑在一起,可以同时使用内存和磁盘,具体取决于您的设置,缓存中的数据可以在服务重新启动(或重新启动)后存活,并且可以设置为在一定程度的不活动后自动使记录过期。是的,这是可能的


我建议你采取这种方法时要小心。您需要权衡每次从缓存中抓取数据(例如在onRequestStart中)的性能损失,以及在onSessionStart()中抓取数据并在多个应用程序中保留重复数据直到会话超时所消耗的内存。您选择哪条路线完全取决于应用程序的性能特征、会话数据的大小等。

+1了解如何使用应用程序[REQUEST.subappname]——这可能实现我的目标。+1了解如何使用Ehcache。它是Adobe CF9+的一个非常好的、非常容易使用的附加组件,Railo也可以使用它。Railo和OpenBD还支持memcached开箱即用。