Coldfusion 我可以通过什么方式强制会话结束?

Coldfusion 我可以通过什么方式强制会话结束?,coldfusion,Coldfusion,我想强制一个会话在30分钟后结束,而不考虑活动。我想到的第一件事是(未经测试): 还有哪些其他方法可以强制会话结束 最明显的一个是会话cookie在30分钟后过期。但我不确定会话cookie是否会监听sessionTimeOut消息 更新 我刚发现。所以我想我应该让饼干过期。像往常一样,本·纳德尔已经在博客上给出了答案 有几个选项,一些非常安全,另一些使用隐藏的方法,这些方法不能保证在未来版本的ColdFusion或其他CFML引擎中出现。你可能会发现我在他的帖子中被提到,因为我喜欢摆弄那些隐

我想强制一个会话在30分钟后结束,而不考虑活动。我想到的第一件事是(未经测试):

还有哪些其他方法可以强制会话结束

最明显的一个是会话cookie在30分钟后过期。但我不确定会话cookie是否会监听sessionTimeOut消息

更新
我刚发现。所以我想我应该让饼干过期。

像往常一样,本·纳德尔已经在博客上给出了答案

有几个选项,一些非常安全,另一些使用隐藏的方法,这些方法不能保证在未来版本的ColdFusion或其他CFML引擎中出现。你可能会发现我在他的帖子中被提到,因为我喜欢摆弄那些隐藏的方法。但如果你想把事情做好(更适合未来/更适合发动机开关),我建议你使用本的替代方法

编辑

差点忘了,我用另一种方法创建了一个函数来停止当前会话(Ben Nadel的博客文章中没有提到)。它仍然是一个未记录的特性,但它是一个改进,因为它会立即停止会话,而不是将会话设置为1秒超时

进一步编辑

只是简单地解释一下不同的方法,以防链接的站点消失

要总结在其轨道中停止会话的方法

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

    我认为您不想使用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" />