Coldfusion 我可以通过什么方式强制会话结束?
我想强制一个会话在30分钟后结束,而不考虑活动。我想到的第一件事是(未经测试): 还有哪些其他方法可以强制会话结束 最明显的一个是会话cookie在30分钟后过期。但我不确定会话cookie是否会监听sessionTimeOut消息 更新Coldfusion 我可以通过什么方式强制会话结束?,coldfusion,Coldfusion,我想强制一个会话在30分钟后结束,而不考虑活动。我想到的第一件事是(未经测试): 还有哪些其他方法可以强制会话结束 最明显的一个是会话cookie在30分钟后过期。但我不确定会话cookie是否会监听sessionTimeOut消息 更新 我刚发现。所以我想我应该让饼干过期。像往常一样,本·纳德尔已经在博客上给出了答案 有几个选项,一些非常安全,另一些使用隐藏的方法,这些方法不能保证在未来版本的ColdFusion或其他CFML引擎中出现。你可能会发现我在他的帖子中被提到,因为我喜欢摆弄那些隐
我刚发现。所以我想我应该让饼干过期。像往常一样,本·纳德尔已经在博客上给出了答案 有几个选项,一些非常安全,另一些使用隐藏的方法,这些方法不能保证在未来版本的ColdFusion或其他CFML引擎中出现。你可能会发现我在他的帖子中被提到,因为我喜欢摆弄那些隐藏的方法。但如果你想把事情做好(更适合未来/更适合发动机开关),我建议你使用本的替代方法 编辑 差点忘了,我用另一种方法创建了一个函数来停止当前会话(Ben Nadel的博客文章中没有提到)。它仍然是一个未记录的特性,但它是一个改进,因为它会立即停止会话,而不是将会话设置为1秒超时 进一步编辑 只是简单地解释一下不同的方法,以防链接的站点消失 要总结在其轨道中停止会话的方法
- 标记目标会话(例如session.remove=true)
- 检测并设置低超时(application.cfc)
if(StructKeyExists(session,'remove')和aession.remove){ this.sessionTimeout=CreateTimeSpan(0,0,0,1); }
- 通过删除CFID/CFTOKEN Cookie删除客户端和会话之间的关联
- 未记录,但在不同版本之间可能会更改,恕不另行通知
- 更灵活,不必在application.cfc文件中包含代码
- 仍然需要删除cookies
- 更多地使用可能在不同版本之间中断的未记录功能
- 可在任何地方使用,无需担心饼干或单秒超时
<cffunction name="sessionStop" output="false">
<cfset var local = StructNew() />
<cfif Not StructKeyExists(application, 'applicationName')>
<cfthrow message="Application.applicationName is missing." />
</cfif>
<cftry>
<cfset local.sid = session.cfid & '_' & session.cftoken />
<cfset local.jTracker = CreateObject('java', 'coldfusion.runtime.SessionTracker') />
<cfset local.jTracker.cleanUp(application.applicationName, local.sid) />
<cfcatch type="any">
<cfthrow message="Error stopping session, may not exist." />
</cfcatch>
</cftry>
</cffunction>
我认为您不想使用structClear()。如果我没记错的话,如果从会话结构中删除CFID和CFTOKEN键,就会出现问题。下面是我们用来结束会话的代码:
<!--- Delete the session --->
<cfloop collection="#session#" item="skey">
<cfif NOT listFindNoCase("cfid,cftoken,sessionid,urltoken", skey)>
<cfset structDelete(session, skey) />
</cfif>
</cfloop>
<!--- Expire the CFID and CFTOKEN cookies to start a new session --->
<cfcookie name="cfid" expires="Now" />
<cfcookie name="cftoken" expires="Now" />
<!--- Expire the JSESSIONID cookie - only needed if J2EE sessions are used --->
<cfcookie name="jsessionid" expires="Now" />
因此,我们从会话中删除除CFID、CFTOKEN、SESSIONID和URLTOKEN之外的所有密钥,然后使标识会话的cookie过期。发生这种情况时,CF应创建新cookie并启动新会话。您需要使用StructClear(会话)而不是StructDelete。StructDelete用于从结构中删除单个键。Sean,如果您是对的,structClear()不会结束会话。我一秒钟前才发现。是的,我不是说它会(因此我使用了注释而不是答案),我只是想指出,如果保持原样,您的原始代码示例将失败。我做到了!当你发布答案时,我也在读那篇博客文章。好东西!干杯当纳德尔先生的博客消失或改变其目录结构时,这个答案将毫无价值。至少总结一下答案如何?很好,我已经更新了一些方法的简要描述。应该足以让人们写出所需的代码:)@MisterDai Nice one!顺便问一下:当您遇到无法找到cleanUp()方法的错误时会发生什么?这在我的旧服务器上非常有效,但在新服务器上不起作用。是否有需要启用的设置?
<!--- Delete the session --->
<cfloop collection="#session#" item="skey">
<cfif NOT listFindNoCase("cfid,cftoken,sessionid,urltoken", skey)>
<cfset structDelete(session, skey) />
</cfif>
</cfloop>
<!--- Expire the CFID and CFTOKEN cookies to start a new session --->
<cfcookie name="cfid" expires="Now" />
<cfcookie name="cftoken" expires="Now" />
<!--- Expire the JSESSIONID cookie - only needed if J2EE sessions are used --->
<cfcookie name="jsessionid" expires="Now" />