Как выполнить запрос в конце сеанса?

У меня есть запрос, который должен выполняться в конце сеанса. Если есть запись, привязанная к учетной записи пользователя, я хотел бы удалить эту запись. Я использую область сеанса для хранения идентификаторов пользователей. После того, как пользователь вручную выйдет из системы или время его сеанса истечет, этот запрос должен быть запущен. Вот пример:

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, но код, который у меня есть выше, никогда не удаляет записи из таблицы базы данных. Я не уверен, что что-то не так в моем коде или это невозможно достичь в конце сеанса.


person espresso_coffee    schedule 27.08.2018    source источник
comment
В onSessionEnd session недоступен. Вместо этого вы должны использовать имя аргумента, т.е. arguments.sessionScope   -  person SOS    schedule 27.08.2018
comment
@Ageax Я исправил это, и если время сеанса истекло, запрос будет обработан. Однако, если пользователь выходит из системы вручную, onSessionEnd не срабатывает. Знаете ли вы, можно ли вручную вызвать onSessionEnd int hat case?   -  person espresso_coffee    schedule 27.08.2018
comment
@espression_coffee - Технически да, хотя я думаю, что, вероятно, имеет смысл иметь логику выхода из системы в компоненте, а затем вызывать соответствующий метод из обоих мест.   -  person SOS    schedule 27.08.2018


Ответы (1)