如何在会话结束时运行查询?

时间:2018-08-27 20:03:46

标签: session coldfusion session-management coldfusion-2016

我有应在会话结束时运行的查询。如果有与用户帐户绑定的记录,那么我想删除该记录。我使用会话作用域来存储用户ID。用户手动注销或会话超时后,此查询应运行。这是示例:

public void function onSessionEnd(required struct sessionScope, struct applicationScope={}) {
    local.qryTest = new Query();
    local.qryTest.setDatasource("#arguments.Application.dsnWriteDelete#");
    local.qryTest.setSQL("DELETE Locked WHERE RecID = :RecID");
    local.qryTest.addParam(name="RecID",value="#SESSION.userID#",cfsqltype="cf_sql_integer");
    qryTest.execute();

    return; 
} 

我在我的应用程序中使用J2EE会话。当用户手动注销时,这是我结束会话的方式:

<cffunction name="LogOut" access="remote" output="yes" returnformat="JSON">
        <cfset local.fnResults = structNew()>

        <cfif structKeyExists(SESSION.AccountInfo, "AccountID")>
            <cftry>
                <cfset local.temp = getPageContext().getSession().invalidate()>
                <cfset local.fnResults = {status : "200"}>

                <cfcatch type="any">
                    <cfset local.fnResults = {status : "400", message : "Error! Please contact your administrator."}>
                </cfcatch>
            </cftry>
        <cfelse>
            <cfset local.fnResults = {status : "400", message : "Error! Please contact your administrator."}>
        </cfif>

        <cfreturn fnResults>
    </cffunction>

我不确定onSessionEnd是否与J2EE兼容,但是上面的代码从未删除数据库表中的记录。我不确定代码中是否有错误或在会话结束时无法实现。

1 个答案:

答案 0 :(得分:3)

OnSessionEnd()内没有session范围。您必须改用参数名称,即arguments.sessionScope

  

但是,如果用户手动注销,则不会触发onSessionEnd。您知道是否可以手动触发onSessionEnd int [t] hat case吗?

从技术上讲是可以的,尽管将注销逻辑放置在组件中然后从两个位置(OnSessionEnd和手动注销脚本)调用适当的方法可能更有意义。