假设我有一个域名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登录时,设置的任何SESSION范围变量都与APPLICATION名称“MyApp”相关联。
我可以使用哪种解决方案接受根目录应用程序中的有效登录,然后将用户转发到他们的应用程序,同时继承用户特定的属性?
答案 0 :(得分:3)
简单的答案是你不能。但让我解释一下,因为这也不完全正确。首先,会话与应用程序名称相关联。因此,如果您要使用两个具有相同应用程序名称的application.cfc文件,则两个会话都可用。但是,这不是你在做什么。由于每个名称都有不同的名称,因此每个新会话都会有新的应用程序范围。
您可能想要尝试的是使用FW \ 1和子应用程序。这为您提供了一个主app.cfc,但允许您将功能划分为不同的组。
您还可以从登录页面设置域级Cookie。然后,您可以在其他应用程序中使用它们来盲目地创建会话。
答案 1 :(得分:3)
正如@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()中的数据并在多个应用程序中保留重复数据来消除内存消耗,直到会话超时。您走的路线将完全取决于您的应用程序的性能特征,会话数据的大小等。
答案 2 :(得分:1)
ColdFusion中的会话与特定应用程序绑定。您无法使用ColdFusion中的会话结构在应用程序之间共享它们。 (想象一下,如果您可以从同一服务器上的任何应用程序中提取会话信息,那么您在共享主机上可能会遇到安全噩梦。)
当成功登录到应用程序的根目录时,您需要将会话信息存储在数据库或其他持久性机制中,然后在第一次请求时将客户的会话信息加载到特定于站点的位置应用。您可以在特定于站点的应用程序的application.cfc中的onSessionStart()中执行此操作,甚至可以在onRequestStart()中执行此操作。