3

假设我有一个域 sub.domain.com ,其中一个登录表单位于https://sub.domain.com/login.cfm

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

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

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

扩展sub.domain.com/Application.cfc(使用代理 cfc) THIS.Name = "MyApp_Site1";

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

但是,当他们在https://sub.domain.com/login.cfm登录时,在那里设置的任何会话范围变量都与应用程序名称“MyApp”相关联。

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

4

3 回答 3

4

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

您不需要使用 FW\1 之类的框架或类似的框架来获得您正在寻找的东西,尽管它们可能会使它更容易一些。您始终可以将结构存储在应用程序范围内,键是子应用程序名称。例如 application.myvariable 可以是 application[request.subappname].myvariable。这使您可以使用一个应用程序,但应用程序变量的范围适用于各种子应用程序。您也可以对会话变量执行相同的操作。

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

数据库将是解决此问题的常规方法,但根据您的应用程序,这可能会导致并发和锁定问题、序列化/反序列化或性能问题,然后总是处理旧/过期数据的清除。因此,您可能想研究ehcachememcached之类的东西来处理这个问题。

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

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

于 2012-08-01T00:39:14.990 回答
3

简单的答案是你不能。但是让我解释一下,因为这也不完全正确。首先,会话与应用程序名称相关联。因此,如果您有 2 个应用程序名称相同的 application.cfc 文件,则会话将可用于两者。但是,这不是您正在做的事情。由于您在每个名称中都有不同的名称,因此每个新会话也会有新的应用程序范围。

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

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

于 2012-07-31T23:55:29.207 回答
1

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

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

于 2012-07-31T20:20:04.413 回答