Можно ли установить переменную сеанса в Application.cfc, а затем получить ее с любой из страниц приложения?

В примере, который я предоставил, я хотел бы, чтобы index.cfm отображал hello Как я могу это сделать?

Приложение.cfc

<cfcomponent>
    <cfset this.sessionManagement = true /> 

    <cffunction name="onSessionStart">
        <cfset SESSION.myVar = "hello">
    </cffunction>

</cfcomponent>

index.cfm

<html>
    <head>

    <title>Testing</title>

    </head>

    <body>
        <cfoutput>#SESSION.myVar#</cfoutput>
    </body>
</html>

Я обнаружил, что когда я добавляю

<cfinvoke component="Application" method="onSessionStart">

для index.cfm это работает, однако все переменные переопределяются каждый раз при обновлении страницы.


person John    schedule 08.11.2011    source источник


Ответы (3)


Вам нужно дать вашему приложению имя, например:

<cfset this.name = "foo">

В вашем псевдоконструкторе Application.cfc. В противном случае CF не сможет создать приложение и не сможет связать сеанс с приложением.

person Adam Cameron    schedule 08.11.2011
comment
дух. не могу поверить, что я пропустил это. +1 - person Eric Belair; 09.11.2011

Я предполагаю, что вы новичок в ColdFusion или, по крайней мере, в Application.cfc, но да, onSessionStart — это основной способ инициировать переменные сеанса в вашем приложении. Конечно, их можно установить/удалить/сбросить на любой другой странице, поэтому было бы неплохо проверить наличие переменной в области SESSION перед ее выводом:

<cfif StructKeyExists(SESSION, "myVar")>
    <cfoutput>#SESSION.myVar#</cfoutput>
</cfif>

Если переменная не сохраняется, проверили ли вы настройку времени ожидания сеанса (в администраторе ColdFusion)? Вы можете установить его там, что устанавливает значение по умолчанию для всех приложений на сервере, или вы можете установить его прямо в Application.cfc:

THIS.SessionTimeout = CreateTimeSpan(0, 1, 0, 0); // One hour Session Timeout
person Eric Belair    schedule 08.11.2011
comment
+1 за предупреждение о том, что переменные определены на каждой странице. - person John; 08.11.2011

Да, вы можете установить переменные в onSessionStart и использовать их в приложении. Функция onSessionStart срабатывает только при создании нового сеанса, поэтому, если она вызывается при каждом запросе, ваши сеансы не сохраняются (ваш CFID/CFTOKEN, JSESSIONID) не передаются последующим запросам. Вероятно, это связано с отключением файлов cookie.

person Pete Freitag    schedule 08.11.2011
comment
У меня вызывался onSessionStart при каждом запросе по несколько иной причине. Мой application.cfc расширен из ColdBox, но у меня также был загружен отдельный запущенный экземпляр ColdBox (ошибка копирования/вставки). Таким образом, иногда это может произойти, даже если информация о сеансе передается обратно. - person jinglesthula; 22.12.2011