我可以通过哪些方式强制会话结束?

时间:2011-10-20 13:00:33

标签: coldfusion

我希望强制会话在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。所以我想我应该把饼干过期。

2 个答案:

答案 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/

进一步修改

简单地解释一下不同的方法,以防链接网站失败。

总结在其中跟踪会话的方法......

  1. 将sessionTimeout设置为1秒的值。
    • 标记目标会话(例如,session.remove = true)
    • 检测并设置低超时(application.cfc) if (StructKeyExists(session, 'remove') And aession.remove) { this.sessionTimeout = CreateTimeSpan(0, 0, 0, 1); }
    • 删除CFID / CFTOKEN Cookie,删除客户端与sesssion之间的关联。
  2. 与上面类似但使用session.setMaxInactiveInterval(1)
    • 未记载,有效,但可能会在版本之间发生变化,恕不另行通知。
    • 更灵活,不必在application.cfc文件中包含代码。
    • 仍然需要删除Cookie。
  3. 强制ColdFusion立即删除会话。
    • 更多地使用可能在版本之间中断的未记录的功能。
    • 可以在任何地方使用,不必担心cookie或单次秒超时。
  4. 方法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并开始新的会话。