如何在服务器上/同一域下的多个 ColdFusion 应用程序之间共享会话?
Posted
技术标签:
【中文标题】如何在服务器上/同一域下的多个 ColdFusion 应用程序之间共享会话?【英文标题】:How can I share a SESSION between multiple ColdFusion applications on the server/under the same domain? 【发布时间】:2012-07-29 16:09:27 【问题描述】:假设我有一个域 sub.domain.com,其中一个登录表单位于 https://sub.domain.com/login.cfm。
在根目录中,我有我的 Application.cfc,它使用 THIS.Name = "MyApp";
命名应用程序。
我在这个网站上有几个子目录,我想将它们作为单独的应用程序运行,它们自己的 Application.cfc 扩展了根 Application.cfc,但每个都有自己的名称,这样我就可以创建 Application-该应用程序独有的范围变量:
例如:sub.domain.com/site1/Application.cfc
扩展 sub.domain.com/Application.cfc(使用代理 cfc)
THIS.Name = "MyApp_Site1";
并设置一些特定于应用程序的应用程序范围变量。
但是,当他们在https://sub.domain.com/login.cfm 登录时,在那里设置的任何会话范围变量都与应用程序名称“MyApp”相关联。
我可以使用什么样的解决方案来接受根目录应用程序中的有效登录,然后将用户转发到他们的应用程序,同时保留他们的用户特定属性?
【问题讨论】:
【参考方案1】:正如@Dave Ferguson 所提到的,共享会话数据的最简单、最冷酷的方法是将其保留为单个应用程序。您甚至可以将内容放在不同的文件夹中,只要名称相同即可。
您不需要使用 FW\1 之类的框架或类似的框架来获得您正在寻找的东西,尽管它们可能会使它变得更容易一些。您始终可以将结构存储在应用程序范围内,键是子应用程序名称。例如 application.myvariable 可以是 application[request.subappname].myvariable。这使您可以使用一个应用程序,但应用程序变量的范围适用于各种子应用程序。您也可以对会话变量执行相同的操作。
正如@Brian 提到的,另一种方法是使用中间商店。然后,您可以使用所需的任何密钥存储会话数据。正如@Dave Ferguson 提到的,将您的 CFID 和 CFTOKEN 设置为域 cookie(特别是 CF10 在setting up the cookies 中有一些改进)。这样,相同的 CFID 和 CFTOKEN 将在应用程序中使用。它们仍然有不同的会话,但使用相同的会话标识符。然后,您可以将该组合用作中间存储中数据的密钥。
数据库将是解决此问题的常规方法,但根据您的应用,这可能会导致并发和锁定问题、序列化/反序列化或性能问题,然后总是处理旧/过期数据的清除。因此,您可能需要查看 ehcache 或 memcached 之类的内容来处理此问题。
ehcache 尤其是一个有吸引力的选项,因为它与 ColdFusion 9+ 捆绑在一起,可以同时使用内存和磁盘,具体取决于您的设置,缓存中的数据可以在服务重启(或重启)后仍然存在,并且它可以设置为在一定数量的不活动后自动过期记录。是的,它可以是used for custom caches。
我建议您在采用这种方法时要小心。您需要权衡每次从缓存中获取数据的性能损失(比如在 onRequestStart 中),与通过在 onSessionStart() 中获取数据并在多个应用程序中保存重复数据所消耗的内存,直到会话超时。你走哪条路将完全取决于你的应用程序的性能特征、你的会话数据的大小等。
【讨论】:
+1 了解有关使用 APPLICATION[REQUEST.subappname] 的想法 - 这可能会实现我想要的。 +1 用于使用 Ehcache。它是 Adobe CF9+ 的一个出色且非常易于使用的补充,可用于 Railo。 Railo 和 OpenBD 还支持开箱即用的 memcached。【参考方案2】:简单的答案是你不能。但是让我解释一下,因为这也不完全正确。首先,会话与应用程序名称相关联。因此,如果您有 2 个应用程序名称相同的 application.cfc 文件,则两个会话都可以使用。但是,这不是您正在做的事情。由于您在每个名称中都有不同的名称,因此每个新会话也会有新的应用程序范围。
您可能想尝试使用 FW\1 和子应用程序。这为您提供了一个主 app.cfc,但允许您将功能分解为不同的组。
您还可以从登录页面设置域级别的 cookie。然后,您可以在其他应用程序中使用它们来盲目地创建会话。
【讨论】:
【参考方案3】:ColdFusion 中的会话与特定应用程序相关联。您不能使用 ColdFusion 中的会话结构在应用程序之间共享它们。 (想象一下,如果您可以从同一服务器上的任何应用程序中提取会话信息,您将在共享主机上遇到安全噩梦。)
当客户成功登录到应用程序的根目录时,您需要将会话信息存储在数据库或其他一些持久性机制中,然后在对特定站点应用程序的第一次请求时加载客户的会话信息。您可以在特定于站点的应用程序的 application.cfc 中的 onSessionStart() 中执行此操作,甚至可以在 onRequestStart() 中执行此操作。
【讨论】:
以上是关于如何在服务器上/同一域下的多个 ColdFusion 应用程序之间共享会话?的主要内容,如果未能解决你的问题,请参考以下文章