2017-02-16 81 views
0

我想知道是否有办法在会话超时时捕获用户标识。我可以捕捉他们是否点击注销按钮。我只是希望能够捕捉他们的会话是否超时。ColdFusion - 捕获登录日期/时间和注销日期/时间

添加了这个以下

<cffunction name="onSessionEnd" access="public" returntype="void"> 
    <cfquery name="logout" datasource="#application.datasource#"> 
     update user 
     set logout_date = CURRENT_TIMESTAMP 
     where profile_id = #session.user_id# 
    </cfquery> 
    <cfreturn true /> 
</cffunction> 

所以我做了上面它不记录的注销日期时,会话超时。

+5

您可以在[OnSessionStart](https://helpx.adobe.com/coldfusion/cfml-reference/application-cfc-reference/onsessionstart.html)和[OnSessionEnd](https://)中捕获该类信息helpx.adobe.com/coldfusion/cfml-reference/application-cfc-reference/onsessionend.html)。 – Leigh

+0

一旦会话死了,你到了OnSessionEnd我会在哪里获得用户ID以便能够记录他们现在注销?什么范围仍然可用? –

+0

由于会话超时,onSessionEnd将被触发。任何会话变量都将存在,直到该函数完成执行。 –

回答

1

添加此评论作为一个答案为更好的格式
利应有的信用。如果你添加你的答案,我会删除这个赞成你的答案。

鉴于刚添加到答案中的例子,你做错了。正如Leigh在他的评论中指出的那样,您需要在OnSessionEnd方法中以不同的方式引用会话范围。

您还缺少OnSessionEnd方法的参数。

您可能还想确保在尝试使用它们之前定义变量。您的查询中也应该使用<cfqueryparam>

把它放在一起,它应该是这个样子:

<cffunction name="OnSessionEnd" access="public" returntype="void" output="false"> 
    <cfargument name="SessionScope" type="struct" required="true" /> 
    <cfargument name="ApplicationScope" type="struct" required="false" default="#StructNew()#" /> 

    <cfif StructKeyExists(ARGUMENTS.ApplicationScope,"datasource") AND StructKeyExists(ARGUMENTS.SessionScope,"user_id")> 

     <cfquery name="local.logout" datasource="#ARGUMENTS.ApplicationScope.datasource#"> 
      update user 
      set logout_date = CURRENT_TIMESTAMP 
      where profile_id = <cfqueryparam cfsqltype="cf_sql_integer" value="#ARGUMENTS.SessionScope.user_id#" /> 
     </cfquery> 

    <cfelse> 

     <!--- variables are not defined, do something else here? ---> 

    </cfif> 

    <cfreturn /> 
</cffunction> 

而且,请求范围并不在此方法中使用,因为它不是由一个请求来调用。

+0

谢谢,但它涵盖了它相当不错:-)唯一我要添加的是代表应用程序的两个结构和会话范围应该始终存在,因此您可以使用structKeyExists而不是IsDefined(并删除查询“name”) – Leigh

+0

Thanks @Leigh。按照你的建议,我改变了使用'StructKeyExists()'而不是'IsDefined()'的答案。不是查询'name'属性需要吗? –

+0

(编辑)技术上我认为它是可选的。对于'select'语句显然需要捕获结果,但对于delete/insert/update,它并没有做任何事情,因为它们不返回结果集。不伤害任何东西来保持“名称”,但如果你做了,我会'本地'的范围。 – Leigh

0

因此,必须将应用程序变量更改为仅适用于我的会话变量。

<cffunction name="onSessionEnd" access="public" returntype="void"> 
    <cfquery name="logout" datasource="#session.datasource#"> 
     update user 
     set logout_date = CURRENT_TIMESTAMP 
     where profile_id = #session.user_id# 
    </cfquery> 
    <cfreturn true /> 
</cffunction> 
+0

如果我点击注销按钮,但我仍然无法正常工作,但它仍然有效。现在有什么问题? –

+0

由于上面有几个问题(Miguel-F已经解决了这个问题),你可能想删除这个答案,这样就不会让下一个人感到困惑。 – Leigh