我希望强制会话在30分钟后结束,无论活动如何。我想到的第一件事是(未经测试):
function onApplicationStart() application.sessionLife = 30;
function onSessionStart() session.timeStarted = now();
function onRequestStart() {
if ( dateDiff("n", session.timeStarted, now()) > application.sessionLife)
structClear(session);
}
还有哪些其他方法可以强制会话结束?
显而易见的是会话cookie,在30分钟后过期。但我不确定会话cookie是否会收听sessionTimeOut sessting。
更新 我刚发现StructClear() does not end the session。所以我想我应该把饼干过期。
答案 0 :(得分:3)
像往常一样,Ben Nadel已经在博客上写了答案......
http://www.bennadel.com/blog/1847-Explicitly-Ending-A-ColdFusion-Session.htm
有一些选项,一些非常安全,另一些使用隐藏的方法,这些方法无法保证在未来版本的ColdFusion或其他CFML引擎中出现。你可能会发现我在他的帖子中提到了,因为我喜欢搞乱那些隐藏的方法。但是如果你想做正确的事情(更多的未来证明/引擎开关证明),我建议Ben的替代方法。
修改的
几乎忘了,我创建了一个函数来使用另一种方法停止当前会话(在Ben Nadel的博客文章中没有提到)。它仍然是一个没有记录的功能,但它是一个改进,因为它立即停止会话,而不是设置为1秒超时。
http://misterdai.wordpress.com/2010/06/15/cf-sessionstop-ending-a-cf-session/
进一步修改
简单地解释一下不同的方法,以防链接网站失败。
总结在其中跟踪会话的方法......
if (StructKeyExists(session, 'remove') And aession.remove) {
this.sessionTimeout = CreateTimeSpan(0, 0, 0, 1);
}
方法3的代码......
<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>
答案 1 :(得分:1)
我认为您不想使用structClear()。如果我没记错的话,如果从SESSION结构中删除了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之外,我们删除了SESSION中的所有密钥,然后我们使用于识别会话的cookie到期。发生这种情况时,CF应该创建新的cookie并开始新的会话。