Application.cfm отсутствует переменные сеанса после перенаправления 301

Запуск ColdFusion 7.

Application.cfm зацикливает все session переменные в request.session

OnRequestEnd.cfm зацикливает все request.session значения обратно в session

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

У меня есть страница "redirect.cfm", которая либо обеспечивает перенаправление 301 на URL-адрес SEO, либо доставляет контент. Некоторые формы отправляют на старый URL, поэтому требуется перенаправление 301, которое приводит к потере данных POST. Вот как я собирался справиться с этим.

<!--- if form scope exists (posted data) copy it to the request.session scope ---> 
<cfif structKeyExists(form,'fieldNames')>
    <cfset request.session.postData = structCopy(form)>
</cfif>

Затем он переходит к перенаправлению 301, и когда он возвращается к redirect.cfm для доставки контента, он выполняет этот код

<!--- if request.session.postData exists (posted data) copy it to the form scope --->
<cfif structKeyExists(request.session,'postData')>
    <cfset form = structCopy(request.session.postData)>
    <cfset StructDelete(request.session,'postData')>
</cfif>

Это прекрасно работает, если 301 перенаправление не требуется с поста данных.

С перенаправлением 301 я подтвердил, что Application.cfm, OnRequestEnd.cfm оба выполняются дважды (один раз для начального 301 и один раз для доставки контента).

К концу первого вызова OnRequestEnd.cfm session.postdata правильно заполнен данными формы.

После перенаправления 301, и он снова попадает в Application.cfm, session.postdata возвращает struct[empty]

Любая помощь? Спасибо

2 ответа

Решение

structCopy() создает поверхностную копию структуры, что означает, что вложенные структуры используются только для справки, поэтому ваши простые значения сохраняются, а вложенные структуры - нет. Как только ваша структура формы больше не содержит данных, ваша структура postData начала ссылаться на пустую структуру, поэтому ваша ссылка также будет пустой.

Чтобы сделать "глубокую копию" ваших структур, используйте duplicate()

Смотрите также другие структурные функции

Документация CF 9 для удаления структур

[ОБНОВЛЕНИЕ: этот ответ неверен. Я только оставил это здесь, так как провел интересное расследование ситуации, которое, возможно, стоило бы прочитать людям]

То, что сказал @Travis, было проблемой - что "когда структура формы больше не существует, как и ваша структура постданных" - это абсолютно неверно. Ссылка на область видимости могла бы исчезнуть, но пока есть какая-либо ссылка на данные (например, request.session.postData) тогда базовый объект не будет удален.

Вероятно, проблема заключается в том, что при выполнении перенаправления OnRequestEnd.cfm не запускается для этого запроса, поэтому переменные в request.session никогда не копируются в область действия сеанса. Все зависит от того, как вы делаете перенаправление. Я бы предположил, что это было бы с <cflocation>Кроме того, что вы говорите, что используете CFMX7, который не может сделать 301 (что вы говорите, вы делаете): он может только 302. Можете ли вы объяснить, как вы делаете это перенаправление? Приветствия.

Отступление: вы добавляете довольно много накладных расходов плюс узкое место в обоих концах запроса, продолжая все эти устаревшие махинации с блокировкой сеансов. Вы действительно должны отложить некоторое время, чтобы вытащить все это. Эта блокировка переноса блокировки сеанса не нужна с CF5. Также, если ваша область сеанса содержит структуры, вы все равно не уменьшите проблему. Это, очевидно, в сторону; и не имеет ничего общего с вашим актуальным вопросом. Я просто подумал, что стоит упомянуть.

Другие вопросы по тегам