2017-02-16 3 views
0

Ich möchte wissen, ob es eine Möglichkeit gibt, eine Benutzer-ID zu erfassen, wenn ihre Sitzung abläuft. Ich kann erfassen, wenn sie auf eine Schaltfläche zum Abmelden klicken. Ich möchte nur in der Lage sein zu erfassen, wenn ihre Sitzung abläuft.ColdFusion - Capture Login Datum/Uhrzeit und Logout Datum/Zeit

hat dieses Bild unter

<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> 

Also habe ich die oben Es ist das Abmeldedatum, wenn die Sitzung beendet wird nicht aufgezeichnet werden.

+5

Sie können diese Art von Informationen in [OnSessionStart] (https://helpx.adobe.com/coldfusion/cfml-reference/application-cfc-reference/onssessionstart.html) und [OnSessionEnd] (https: // helpx.adobe.com/coldfusion/cfml-reference/application-cfc-reference/onsessionend.html). – Leigh

+0

Sobald die Sitzung tot ist und Sie zu OnSessionEnd gelangen, wo würde ich die Benutzer-ID erhalten, um zu protokollieren, dass sie jetzt ausgeloggt sind? Welcher Umfang wäre noch verfügbar? –

+0

Wenn die Sitzung abläuft, wird onSessionEnd ausgelöst. Jede Sitzungsvariable wird existieren, bis diese Funktion beendet wird. –

Antwort

1

Hinzufügen dieser Kommentar als Antwort für eine bessere Formatierung
Leigh verdient den Kredit. Wenn Sie Ihre Antwort hinzufügen, entferne ich diese zugunsten Ihrer.

Angesichts des Beispiels, das Sie gerade zu Ihrer Antwort hinzugefügt haben, tun Sie es falsch. Wie Leigh in seinen Kommentaren darauf hingewiesen hat, müssen Sie den Sitzungsumfang innerhalb der Methode unterschiedlich referenzieren.

Sie fehlen auch die Argumente für die Methode.

Sie werden wahrscheinlich auch sicherstellen wollen, dass die Variablen definiert sind, bevor Sie versuchen, sie zu verwenden.

Sie sollten auch <cfqueryparam> innerhalb Ihrer Abfragen verwenden.

sie alle zusammen und es sollte wie folgt aussehen:

<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> 

Auch die Anfrage Umfang innerhalb dieser Methode nicht verfügbar ist, weil es nicht durch eine Anforderung aufgerufen wird.

+0

Danke, aber das deckt es ziemlich gut ab :-) Einzige Sache, die ich hinzufügen würde, ist, dass die zwei Strukturen, die die App darstellen, und Sitzungsbereiche immer existieren sollten, also könnte man wahrscheinlich mit structKeyExists anstelle von IsDefined gehen (und die Abfrage "name" ablegen) – Leigh

+0

Danke @Leigh. Ich habe die Antwort geändert, um 'StructKeyExists()' anstelle von 'IsDefined()' zu verwenden, wie Sie vorgeschlagen haben. Ist das Attribut query 'name' nicht erforderlich? –

+0

(Bearbeiten) Technisch denke ich, dass es optional ist. Für 'select' Anweisungen ist es offensichtlich notwendig, das Ergebnis zu erfassen, aber es tut nichts wirklich für' delete/insert/update', da sie kein Resultset zurückgeben. Es tut nichts weh, "Name" zu behalten, aber wenn du es getan hättest, würde ich es "lokal" erfassen. – Leigh

0

So musste die Anwendungsvariable in eine Sitzungsvariable nur eine ändern, die für mich arbeitete.

<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

Ich sprang zu schnell es funktionierte, wenn ich auf den Abmelden-Button klickte, aber das obige funktionierte immer noch nicht. Was ist jetzt falsch? –

+0

Da es mehrere Probleme mit dem oben genannten gibt (die Miguel-F seither angesprochen hat), möchten Sie diese Antwort vielleicht löschen, damit sie für den nächsten nicht verwirrend ist. – Leigh

Verwandte Themen