2

再会,

我们正在尝试在 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 上,输入 URL 的 cfid、cftoken 和 jsessionid 正确地保持会话状态。

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

所以我有三个问题:

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

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

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

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

2 回答 2

4

此设置:

<cfset this.setClientCookies = false /> 

防止设置客户端 cookie (cfid/cftoken)。这与客户端管理而不是会话管理有关。您尚未在属性中设置 clientManagement 值,因此它可能默认为 true - 这意味着这些值正在创建但未设置为 cookie。如果您没有在 URL 上传递它们(我现在谈论的是 cfid/cftoken),那么您可能会创建很多它们。检查您的注册表 :) 作为一项规则,如果您不使用它们,请将 clientmanagement 设置为 false。

CFID 和 CFTOKEN 用于客户端变量,即使您有 jsessionid;启用。但是在使用 jsessionID 时,会话不需要它们。

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

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

于 2012-04-26T13:21:31.163 回答
1

此设置:

<cfset this.setClientCookies = false /> 

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

于 2013-06-24T22:53:31.363 回答