Потеря переменных сеанса между двумя страницами - PullRequest
2 голосов
/ 28 июня 2019

Это странно.Я недавно переместил сайт на виртуальный хостинг на CF11 (я полагаю), поэтому я не знаю, имеет ли это какое-либо отношение к этому.Этого раньше не было.

Я все еще использую application.cfm (не cfc), и в настоящее время это выглядит так:

<CFAPPLICATION 
    NAME="catholicity"
    SESSIONMANAGEMENT="Yes"
    SESSIONTIMEOUT=#CreateTimeSpan(0,2,0,0)#
    CLIENTMANAGEMENT="Yes"
    CLIENTSTORAGE="Cookie"
>

Наш сайт catholicity.co.nz позволяет пользователямдобавить бизнес-списки.Процесс листинга осуществляется поэтапно, сначала выбирается категория, а затем вводится дополнительная информация.Мы храним данные листинга в переменной сеанса с именем «session.post».После выбора категории код jQuery передает выбранную категорию в функцию Coldfusion CFC, которая создает файл session.post и добавляет к нему выбранную категорию (session.post.category).Затем jQuery загружает новую страницу для ввода дополнительной информации.Я подтвердил, что jQuery может читать сессионный объем, созданный в cfc.Именно на этой второй странице область сеанса, кажется, теряется.Session.post не появляется, когда я выкидываю область сеанса вверху этой новой страницы.

код перенаправления javascript выглядит следующим образом:

top.location.href="/post/post.cfm?cat=" + cat + "&subcat=" + subcat + "&mode=" + mode;

Значения cat и subcat читаются напрямуюиз cfc, который возвращает session.post

<cffunction.....>
   ...
   <cfset session.post.category = nCategoryId & "^" & sCategory>
   <cfset session.post.subcategory = arguments.id & "^" & sSubcategory>
   <cfset session.post.prev="subcategory_id">
   <cfset session.post.next="details">
   ...
   <cfreturn session.post>
</cffunction>

Странная часть заключается в том, что если пользователь вошел в систему во время создания нового бизнес-списка, эта проблема не возникает.Я не уверен, почему, потому что при входе в систему создается отдельная переменная сеанса с именем session.user, и, насколько я знаю, нет никакой связи между session.user и session.post.

Проблема может быть проверена вhttp://www.catholicity.co.nz, и нажмите «Добавить бизнес» вверху.Я выгрузил сессию и область видимости клиента на первой и второй страницах, с предупреждением JS о обратном вызове от начального вызова cfc.

EDIT

Мой application.cfm выглядит так:

<CFAPPLICATION 
    NAME="catholicity"
    SESSIONMANAGEMENT="Yes"
    SESSIONTIMEOUT=#CreateTimeSpan(0,2,0,0)#
    CLIENTMANAGEMENT="Yes"
    CLIENTSTORAGE="Cookie"
>

<cfif structKeyExists(session,"cfid")>
    <cfcookie name="cfid" value="#session.cfid#" expires="NOW">
    <cfcookie name="cftoken" value="#session.cftoken#" expires="NOW">
</cfif>

<cfif structKeyExists(url, "logout")>
    <cfset session.user.authenticated = 0>
</cfif>

<cfparam name="session.cfid" default="">
<cfparam name="session.cftoken" default="">

<cfparam name="session.mode" default="temp">

<cfparam name="session.user.authenticated" default="0">
<cfparam name="session.user.confirmed" default="0">
<cfparam name="session.user.disabled" default="0">
<cfparam name="session.user.id" default="">
<cfparam name="session.user.email" default="">
<cfparam name="session.user.contact_name" default="">

<cferror type="exception" template="/error.cfm">

<cfscript>
    application.accepted_docs = "application/pdf,application/msword,application/vnd.ms-excel,text/plain,vnd.ms-word.document.12,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    application.accepted_images = "image/jpg,image/gif,image/jpeg,image/png,image/x-png,image/pjpeg ";
    application.accepted_videos = "video/x-flv,video/mp4,video/x-msvideo,video/x-ms-asf,video/x-ms-wmv,audio/x-ms-wma";
....
</cfscript>

<cflock name="#APPLICATION.applicationName#" 
        type="Exclusive" 
        timeout="20" 
        throwontimeout="Yes"> 

    <cfparam name="APPLICATION.SessionTracker" default=#StructNew()#> 

    <cfscript>
        sUserInfo = StructNew();
        sUserInfo.Address="#CGI.REMOTE_ADDR#";
        sUserInfo.CFID="#session.cfid#";
        sUserInfo.Token="#session.cftoken#";
        sUserInfo.Address="#CGI.REMOTE_ADDR#";
        sUserInfo.Time="#Now()#";
        sUserInfo.Template="#CGI.CF_Template_Path#";
        ID = "#session.cfid##session.cftoken#";
    </cfscript>

   <CFSET dummy = StructInsert(APPLICATION.SessionTracker, ID, sUserInfo, true)> 
</cflock>

Я пытался комментировать потенциально хитроумные фрагменты кода, но безрезультатно.

1 Ответ

3 голосов
/ 29 июня 2019

Я провел тест на вашей странице Application.cfm. Как я уже говорил в комментариях выше, ваша сессия перезапускается для каждого запроса. (Я имею в виду, что ваши значения CFID и CFToken меняются для каждого запроса).

Я прошел через ваш поток кода. Здесь вы сбрасываете файлы cookie CFID и CFToken со значениями сеанса.

<cfif structKeyExists(session,"cfid")>
    <cfcookie name="cfid" value="#session.cfid#" expires="NOW">
    <cfcookie name="cftoken" value="#session.cftoken#" expires="NOW">
</cfif>

При каждом запросе выполняется страница Application.cfm. В это время указанное выше условие structKeyExists(session,"cfid") возвращает true для каждого запроса. Таким образом, каждый запрос запускает код <cfcookie>. Вы установили для файлов cookie срок действия «Сейчас», что означает, что срок их действия истекает немедленно. Так что ваша сессия считается новой. Это проблема в вашем приложении.

Согласно Документам

Срок действия файла cookie истекает, когда пользователь закрывает браузер, то есть файл cookie является «только сеансом».

Поэтому, пожалуйста, проверьте ваше состояние выше. Я не уверен, почему вы истекаете cookie немедленно. Может быть, ваша бизнес-логика такая, но логика кода неверна.

Так что измените эту логику в соответствии с потребностями вашего бизнеса. Удалите этот код и перезапустите приложение, после чего вы получите только один CFID и CFToken для каждого запроса до истечения сеанса.

На изображении ниже я запустил приложение, чтобы установить значение CFCookie. Это считается разным значением CFID и CFToken для каждого запроса. Вы можете увидеть ниже CFID отличается, например, 2106,2107,2108

enter image description here

Если я удалю условие со значением cookie, это будет считаться только одним сеансом. CFID остается 2109 до истечения сеанса.

enter image description here

Поэтому, пожалуйста, исправьте свое состояние и функциональность CFCookie. Это причина проблемы.

...