session - 使用不带 cookie 的 Coldfusion session

标签 session coldfusion application.cfc

美好的一天,

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

我们正在使用 mach-ii 及其 SessionFacade。我不知道您是否需要这方面的更多信息;如果您这样做,请提及。

在 Coldfusion Administrator 中,客户端变量设置为“注册表”,内存变量为每个“使用 J2EE session 变量、启用应用程序变量、启用 session 变量”打勾。

我的 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 中没有任何内容。

为了验证 session ,我使用了一个插件,并在其 preProcess 方法中:

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

我想我首先不明白的是,在使用 J2EE session 时是否有任何情况需要发送 cfid 和 cftoken?还是jsessionid完全取代了它们的功能?

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

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

在禁用 cookie 的 Firefox 上,输入 URL 的 cfid、cftoken 和 jsessionid 可以正确维护 session 状态。

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

所以我有三个问题:

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

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

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

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

最佳答案

此设置:

<cfset this.setClientCookies = false /> 

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

即使您有 jsessionid,CFID 和 CFTOKEN 也用于客户端变量;已启用。但使用 jsessionID 时, session 不需要它们。

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

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

关于session - 使用不带 cookie 的 Coldfusion session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10329392/

相关文章:

php 在 session 中保存对象

java - Spring 4 - session 管理

coldfusion - 添加文字水印

coldfusion - CFC 从哪里获得它的应用范围

ColdFusion Application.cfc - 执行顺序

java - Struts session 表单 bean 不保留状态

xslt - 防止 <cite> 标 checkout 现在 RSS Feed 中

jdbc - UTF8mb4 unicode 破坏 MariaDB JDBC 驱动程序

coldfusion - Application.cfc 与 Application.cfm 在不同的文件夹中具有更高的优先级

node.js - connect-mongo 每秒创建新 session