2017-02-16 9 views
0

세션이 만료 될 때 사용자 ID를 캡처 할 수있는 방법이 있는지 알고 싶습니다. 로그 아웃 버튼을 클릭하면 캡처 할 수 있습니다. 세션이 시간 초과되는지 파악할 수 있기를 바랍니다.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가 로그 아웃 할 수 있도록 사용자 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

고마워,하지만 꽤 잘 커버 :-) 내가 추가 할 유일한 것은 응용 프로그램과 세션 범위를 나타내는 두 개의 구조가 항상 존재해야합니다, 그래서 당신은 아마도 IsDefined (및 쿼리 "이름"드롭) 대신 structKeyExists 함께 갈 수있다 감사합니다. @Leigh. – Leigh

+0

내가 제안한대로'IsDefined()'대신'StructKeyExists()'를 사용하도록 해답을 변경했다. 그래도 쿼리'name' 속성이 필요하지 않습니까? –

+0

(편집) 기술적으로 나는 선택적이라고 생각합니다. 'select' 명령문의 경우 결과를 캡처하는 것이 분명하지만 결과 집합을 반환하지 않으므로'delete/insert/update'에 대해서는 아무 것도하지 않습니다. "이름"을 지키기 위해 아무 것도 해치지 않지만, 만약 당신이했다면 나는'local' 범위를 가질 것입니다. – 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