2012-04-26 46 views
0

美好的一天,使用ColdFusion会议

我们正试图实现在ColdFusion中8的API,其中未使用的cookies - 相反,我们通过GET或POST为每个请求通过CFID,CFTOKEN和JSESSIONID。

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

在Coldfusion Administrator中,客户端变量设置为“Registry”,为“使用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。

为了验证会话,我使用的插件,并在其预处理方法,我有:

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

我觉得我不理解的第一件事就是,是否有任何情况下它是必要的在使用J2EE会话时发送cfid和cftoken?或者jsessionid完全完全取代它们的功能?

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

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

在Firefox禁用Cookie,然后将CFID,CFTOKEN和JSESSIONID进入URL正确维护会话状态。

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

所以我有三个问题:

首先,使用J2EE会话时,在那里,我需要存储和重新发送CFID和CFTOKEN的情况?

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

第三,在哪一个阶段是jsessionid拿起和会议变量从内存填充?这是不是我可以调试或询问,这样我就可以把事情说

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

关于你最后的问题(第三),这是明确的“onSessionStart()”射击。当onSessionStart()触发它意味着事实上你有一个新的jsessionID;大概是空的。 – 2012-04-26 13:06:47

+0

不完全是我的意思 - 我的意思是,在每个请求开始时,当jsessionid从url或cookie中选出时,系统检查它是否属于有效会话,并检索/填充会话数组为了该请求的目的。 – 2012-04-27 01:40:26

回答

3

此设置:

<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上拥有它,你就是对的?

+0

感谢您的“clientManagement”关于您的最后一段,如果cookie被接受但后来丢失,即使使用url中的jsessionid,会话仍然失效。我希望完全摆脱会话cookie。可能有办法破解底层的java并在那里查询/修改它? – 2012-04-27 01:29:26

0

此设置:

<cfset this.setClientCookies = false /> 

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