比方说,我有一个域sub.domain.com与一个登录表单https://sub.domain.com/login.cfm 。
在根目录下,我有我的Application.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的”。
我可以使用什么样的解决方案,以接受在根目录下的应用有效的登录,然后将用户转发到他们的应用程序,同时搭载在其特定用户的属性?
答案很简单,你不能。 但是,让我稍微解释一下,因为这是也并非完全如此。 首先,会话被绑定到应用程序的名称。 所以,如果你有2个的Application.cfc文件都具有相同的应用程序名称的会议将提供两种。 然而,这是不是你在做什么。 既然你在每一个不同的名字会出现新的应用领域为每个这样新的会议以及。
你可能想尝试使用FW \ 1和副应用是。 这给你一个单一的主app.cfc,但可以让你摆脱功能集成到不同的组。
你也可以从登录页面设置域级别的Cookie。 然后,您可以用它们在其它应用程序盲目地创建会话。
正如@戴夫弗格森提到的,最简单的方法,最coldfusiony方式共享会话数据是保持它作为一个单一的应用程序。 你甚至可以在不同的文件夹中的内容,只要名称是相同的。
你不需要使用像FW \ 1的框架或类似的东西,让你在找什么,虽然他们可能使它更容易一点。 您可以在应用程序范围内总是储存结构,关键是在该子应用程序的名称。 例如application.myvariable可以来应用[request.subappname] .myvariable。 这样可以使你有一个应用程序,但应用程序变量的作用域为各个子应用程序。 你可以做同样的你的会话变量太多。
另一种方法,如@布赖恩提到,将使用中介店。 然后,你可以使用任何你想要的密钥存储会话数据。 正如@戴夫弗格森提到的,请将您的CFID和CFTOKEN作为域的Cookie(特别是CF10有一些改进设立饼干 )。 这样,同样的CFID和CFTOKEN将在应用程序中使用。 他们仍然有不同的会话,但使用相同的会话标识符。 然后,您可以使用该组合作为中介店的关键数据。
数据库将去这个传统的方式,但根据您的应用程序,这可能会导致并发和锁定的问题,序列化/反序列化,或性能问题,然后总是有处理旧/过期数据的清洗。 所以,你可能想看看类似的Ehcache或分布式缓存来处理这个问题。
的Ehcache尤其是一个有吸引力的选择,因为它是在ColdFusion 9+捆绑在一起,可以同时使用内存和磁盘,根据您的设置,在缓存中的数据可以生存在服务重新启动(或重启),它可以设置为一定量的非活动状态后自动失效记录。 是的,它可以用于自定义缓存 。
我建议,如果你采取这种方法,你要小心。 你需要在onSessionStart抓取数据()的控股在多种应用中重复权衡性能命中从缓存中的每个时间(比如在onRequestStart)抓取数据,VS内存消耗,直到会话(S)超时。 哪条路线你去将完全取决于你的应用程序的性能特点,您的会话数据的大小,等等。
ColdFusion的会话被绑定到特定的应用程序。 你不能用ColdFusion的会议结构的应用程序之间共享。 (想象一下安全噩梦你会,如果你能在同一台服务器上的任何应用程序拉会话信息的共享主机上)。
您需要将存储在数据库或一些其他持久性机制会话信息,当他们成功登录到您的应用程序的根目录,然后加载客户的会话信息了第一个请求到特定网站的应用程序。 您可以在的Application.cfc您的特定网站的应用程序做到这一点在onSessionStart(),或者甚至在onRequestStart()。
文章来源: How can I share a SESSION between multiple ColdFusion applications on the server/under the same domain?