Каким образом я могу заставить сеанс завершиться? - PullRequest
3 голосов
/ 20 октября 2011

Я хочу принудительно завершить сеанс через 30 минут независимо от активности. Первое, о чем я подумал, было (не проверено):

function onApplicationStart() application.sessionLife = 30;

function onSessionStart() session.timeStarted = now();

function onRequestStart() {
    if ( dateDiff("n", session.timeStarted, now()) > application.sessionLife)
        structClear(session);
}

Какие еще способы можно использовать для завершения сеанса?

Очевидным является файл cookie сеанса, срок действия которого истекает через 30 минут. Но я не уверен, слушают ли сессионные куки сессию sessionTimeOut или нет.

Обновление Я только что узнал, что StructClear () не завершает сеанс . Так что я думаю, что я должен просто истечь печенье.

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

Как обычно, Бен Надель уже опубликовал ответ ...

http://www.bennadel.com/blog/1847-Explicitly-Ending-A-ColdFusion-Session.htm

Есть несколько опций, некоторые из которых достаточно безопасны, другие используют скрытые методы, которые не обязательно будут присутствовать в будущей версии ColdFusion или других механизмов CFML. Вы можете заметить, что я упоминаю об этом в его посте, потому что я люблю возиться с этими скрытыми методами. Но если вы хотите сделать все правильно (больше на будущее / на выключатель двигателя), я бы предложил альтернативные методы Бена.

Редактировать

Почти забыл, я создал функцию, чтобы остановить текущую сессию, используя другой метод (не упоминание в блоге Бена Наделя). Это все еще недокументированная функция, но является улучшением, поскольку она мгновенно останавливает сеанс, вместо того, чтобы установить его на 1 секунду для тайм-аута.

http://misterdai.wordpress.com/2010/06/15/cf-sessionstop-ending-a-cf-session/

Дальнейшее редактирование

Просто кратко объясним различные методы на случай, если связанные сайты когда-либо не получатся.

Подводя итог, как остановить сеанс в его треках ...

  1. Установите для sessionTimeout значение 1 секунда.
    • Отметить целевой сеанс (например, session.remove = true)
    • Обнаружение и установка низкого тайм-аута (application.cfc) if (StructKeyExists(session, 'remove') And aession.remove) { this.sessionTimeout = CreateTimeSpan(0, 0, 0, 1); }
    • Удалите связь между клиентом и сеансом, удалив файлы cookie CFID / CFTOKEN.
  2. Аналогично выше, но с использованием session.setMaxInactiveInterval (1)
    • Недокументированный, работает, но может меняться без уведомления между версиями.
    • Более гибкий, не обязательно иметь код в файле application.cfc.
    • Еще нужно удалить куки.
  3. Принудительно ColdFusion немедленно удалить сеанс.
    • Более широкое использование недокументированных функций, которые могут ломаться между версиями.
    • Может использоваться где угодно, не нужно беспокоиться о файлах cookie или тайм-ауте.

Код для захода на посадку 3 ...

<cffunction name="sessionStop" output="false">
  <cfset var local = StructNew() />
  <cfif Not StructKeyExists(application, 'applicationName')>
    <cfthrow message="Application.applicationName is missing." />
  </cfif>
  <cftry>
    <cfset local.sid = session.cfid & '_' & session.cftoken />
    <cfset local.jTracker = CreateObject('java', 'coldfusion.runtime.SessionTracker') />
    <cfset local.jTracker.cleanUp(application.applicationName, local.sid) />
    <cfcatch type="any">
      <cfthrow message="Error stopping session, may not exist." />
    </cfcatch>
  </cftry>
</cffunction>
1 голос
/ 05 марта 2012

Не думаю, что вы хотите использовать structClear (). Если я правильно помню, есть проблемы, если ключи CFID и CFTOKEN удаляются из структуры SESSION. Вот код, который мы используем для завершения сеанса:

<!--- Delete the session --->
<cfloop collection="#session#" item="skey">
    <cfif NOT listFindNoCase("cfid,cftoken,sessionid,urltoken", skey)>
        <cfset structDelete(session, skey) />
    </cfif>
</cfloop> 

<!--- Expire the CFID and CFTOKEN cookies to start a new session --->
<cfcookie name="cfid" expires="Now" />
<cfcookie name="cftoken" expires="Now" />

<!--- Expire the JSESSIONID cookie - only needed if J2EE sessions are used --->
<cfcookie name="jsessionid" expires="Now" />

Таким образом, мы удаляем все ключи из SESSION, кроме CFID, CFTOKEN, SESSIONID и URLTOKEN, затем мы удаляем файлы cookie, которые идентифицируют сеанс. Когда это происходит, CF должен создать новые куки и начать новый сеанс.

...