Next Page

1

Previous Page

スレッド: Application.cfcのonSessionEnd()の実行されるタイミングについて

作成日: 06/12/17 06:40 PM

返信: 1

burnercrew


新米


入会日: 05/30/07

投稿数: 6

Application.cfcのonSessionEnd()の実行されるタイミングについて
06/12/17 6:40 PM

いつもお世話になっております。

Application.cfcのonSessionEnd()メソッドの実行されるタイミングついて、
以下の動作を期待していたのですが、onSessionEnd()メソッドが実行されません。

1)セッションタイムアウトを5分に指定。
2)あるWebシステムにログインし、セッションを開始
3)5分立つ前にブラウザの閉じるボタンでブラウザを終了させる。
4)セッション開始から5分経過したら、Application.cfcのonSessionEnd()メソッドが実行される。
※現在はonSessionEnd()メソッド内に<cflog>を記述し、実行されているか確認しています。

実際に実現しようとしている事は、ログイン時にデータベースにログインしたユーザーのIDを保存し、
ログアウトボタンを押さずにブラウザを閉じた場合、セッションがタイムアウトしたタイミングで、
ログイン時に保存したIDのレコードをデータベースから消すというものです。

お気づきの点、等、ございましたらご教示いただけると幸いです。
どうぞよろしくお願いいたします。

Link | Top | Bottom

kit


新米
kit's Gravatar

入会日: 05/31/07

投稿数: 19

RE: Application.cfcのonSessionEnd()の実行されるタイミングについて
06/12/17 8:53 PM

この辺りのサンプルの切り貼りなのですが、一応sessionEndも呼ばれているようでした。
何か違いがあるでしょうか?

http://help.adobe.com/ja_JP/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7d4b.html

http://help.adobe.com/ja_JP/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7d40.html

バージョンは「ColdFusion Server デベロッパー 10,0,16,293499」で確認しています。

■Application.cfc
<cfcomponent output="false"><cfprocessingdirective pageencoding="UTF-8" /><cfsetting enablecfoutputonly="yes">
	<cfcontent type="text/html; charset=UTF-8">
	<cfscript>
		setencoding("URL", "UTF-8");
		setencoding("FORM", "UTF-8");
	</cfscript>

	<cfset this.name = "sessionTest">
	
	<cfset This.sessionmanagement = true>
	<cfset This.clientmanagement = false>
	<cfset This.setclientcookies = true>
	<cfset This.setdomaincookies = false>
	<cfset This.sessiontimeout="#createtimespan(0, 0, 5, 0)#">

	<cffunction name="onApplicationStart"> 
		<cfset Application.sessions = 0> 
	</cffunction>

	<cffunction name="onSessionStart"> 
	    <cfscript> 
	        Session.started = now(); 
	    </cfscript> 

        <cflock scope="Application" timeout="5" type="Exclusive"> 
            <cfset Application.sessions = Application.sessions + 1> 
	    </cflock> 

	    <cflog file="#This.Name#" type="Information"  
	        text="SessionStart #Session.sessionid# started. start: #Session.started# Active sessions: #Application.sessions#">
	</cffunction>

	<cffunction name="onSessionEnd"> 
	    <cfargument name = "SessionScope" required=true/> 
	    <cfargument name = "AppScope" required=true/> 

	    <cfset var sessionLength = TimeFormat(Now() - SessionScope.started, "H:mm:ss")> 

	    <cflock name="AppLock" timeout="5" type="Exclusive"> 
	        <cfset Arguments.AppScope.sessions = Arguments.AppScope.sessions - 1> 
	    </cflock> 

	    <cflog file="#This.Name#" type="Information"  
	        text="Session #Arguments.SessionScope.sessionid# ended. Length: #sessionLength# Active sessions: #Arguments.AppScope.sessions#">
	</cffunction>

</cfcomponent>

ところで、ややそれますが、CFのクラッシュ等まで考えるとSessionEndは確実に呼ばれるとは限らないと思いますので、DBなどの永続的な後始末をする場合は、何らかのリカバリ手段も必要なのかなと思います。
* Last updated by: kit on 6/12/2017 @ 8:55 PM *

Link | Top | Bottom

Next Page

1

Previous Page

新規投稿

ログイン して返信して下さい。