使用没有cookie的Coldfusion会话

时间:2012-04-26 08:01:10

标签: session coldfusion application.cfc

美好的一天,

我们正在尝试在Coldfusion 8中实现一个不使用cookie的API - 而是通过GET或POST为每个请求传递cfid,cftoken和jsessionid。

我们正在使用mach-ii及其SessionFacade。我不知道您是否需要任何进一步的信息;如果你这样做,请提及。

在Coldfusion Administrator中,客户端变量设置为“注册表”,每个“使用J2EE会话变量,启用应用程序变量,启用会话变量”都会选中内存变量。

我的Application.cfc伪构造函数看起来像

<cfset this.name = "#cgi.server_name#" />
<cfset this.loginStorage = "session" />
<cfset this.sessionManagement = true />
<cfset this.setClientCookies = false />
<cfset this.setDomainCookies = false />
<cfset this.sessionTimeOut = CreateTimeSpan(0,1,0,0) />
<cfset this.applicationTimeOut = CreateTimeSpan(0,1,0,0) />

并且onSessionStart或onSessionEnd中没有任何内容。

要验证会话,我正在使用插件,并在其preProcess方法中我有:

if (not getSessionFacade().has("authUserLoggedIn")){
    arguments.eventContext.clearEventQueue();
    arguments.eventContext.announceEvent("nologin", newEventArgs);
}

我认为我不理解的第一件事是,在使用J2EE会话时是否有必要发送cfid和cftoken?或者jsessionid是否完全取代了他们的功能?

其次,我希望这个应用程序(而不是整个服务器)不发送cookie。在我的Application.cfc中,我将cookie设置为禁用,但它仍然尝试发送包含jsessionid的cookie。

这有我认为是奇怪的副作用:

在禁用cookie的Firefox上,cfid,cftoken和jsessionid进入URL正确维护会话状态。

但我们也将它用于接受cookie的iPhone应用程序。在我们通过将cookie保存到本地存储来修复它之前,当您关闭应用程序并重新打开它时,cookie就丢失了。无论在URL中发送仍然有效的cfid,cftoken和jsessionid这一事实,它仍然给我们一个“未登录”错误。

所以我有三个问题:

首先,在使用J2EE会话时,是否存在需要存储和重新发送cfid和cftoken的情况?

其次,是否有一个应用程序级别设置可以用来强制手动存储jsessionid,而不是使用cookie?

第三,在哪个阶段拾取jsessionid并从内存中填充会话变量?这是我可以调试或询问的东西,所以我可以说些什么来说

if jsessionid refers to a current, valid session {
    ...
}

2 个答案:

答案 0 :(得分:3)

此设置:

<cfset this.setClientCookies = false /> 

阻止设置客户端cookie(cfid / cftoken)。这与客户端管理和会话管理有关。您没有在属性中设置clientManagement值,因此它可能默认为true - 表示正在创建这些值但未设置为cookie。如果你没有在URL上传递它们(我现在正在谈论cfid / cftoken),你可能会创建很多它们。检查你的注册表:)如果你没有使用它们,通常将clientmanagement设置为false。

CFID和CFTOKEN用于客户端变量,即使你有jsessionid也是如此;启用。但是当使用jsessionID时,会话不应该需要它们。

我知道的app属性中没有setClientCookies等效。从逻辑上讲,我希望看到一个“setSessionCookies =”,这样你就可以对这些变量进行精细控制。但事实并非如此。我怀疑可能因为CF正在进入底层的j2ee会话架构,这就是它在幕后的方式。但不要引用我。

但是,我想知道为什么你不只是捕获jsessionID;在onSessionStart()中根据需要将其传递给您的URL。可能会设置Cookie - 或者它们可能不是基于所涉及的平台或客户端......但只要您在网址上有它就可以了吗?

答案 1 :(得分:0)

此设置:

<cfset this.setClientCookies = false /> 

设置CFID&amp; CFTOKEN或JSESSIONID cookies。这些用于客户端和会话!因此,如果将此设置为false并且未在请求URL中放置CFID / CFTOKEN或JSESSIONID,则无法使用会话管理。