Ошибка переключения на управление клиентами

Это раздражительно. Я работаю разработчиком ColdFusion уже 13 лет, и у меня никогда не было причин использовать управление клиентами вместо управления сеансами. В любом случае, я настроил базу данных и источник данных в CFAdmin, а затем выбрал этот источник данных в качестве механизма хранения по умолчанию для клиентских сеансов.

Затем я просмотрел весь свой код и глобально заменил все мои области сеанса областью клиентов.

Верхняя часть моего application.cfm выглядит так:

<CFAPPLICATION 
    NAME="blah"
    SESSIONMANAGEMENT="No"
    SESSIONTIMEOUT=#CreateTimeSpan(0,2,0,0)#
    CLIENTMANAGEMENT="Yes"
    CLIENTSTORAGE="sys_blah"
>

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

<cfparam name="session.user.authenticated" default="0">
<cfparam name="session.user.id" default="">

Однако теперь, когда они записываются как

<cfparam name="client.user.authenticated" default="0">
<cfparam name="client.user.id" default="">

Я получаю сообщение об ошибке:

Элемент USER не определен в CLIENT.

Что я могу делать неправильно?

Я вижу, как переменные клиента входят в только что созданную базу данных. я на CF12


person user460114    schedule 05.05.2016    source источник
comment
<cfdump var="#client#'> поможет вам начать работу. Ваше смущение оправдано тем, что вы не знали этого спустя 13 лет.   -  person Dan Bracuk    schedule 06.05.2016
comment
С уважением, не согласен. Они не сказали, что не знают, как использовать cfdump или что не пробовали его ;-) Мы все время от времени спотыкаемся о мелочи, несмотря на многолетний опыт. Иногда вам просто нужен небольшой толчок или вторая пара глаз, чтобы подтолкнуть вас обратно в нужное русло. Особенно для тех, кто работает в одиночку. Проблема может заключаться в том, что CF обрабатывает имя ключа как user.id, а не структуру с именем user с ключом с именем id. Конечно, это возвращает нас к первому пункту Дэна, с которым я действительно согласен :) Вы должны использовать cfdump, чтобы подтвердить или опровергнуть эту теорию.   -  person Leigh    schedule 06.05.2016


Ответы (1)


Переменные клиента должны быть простыми типами данных: строками, числами, списками, логическими значениями или значениями даты и времени. Они не могут быть массивами, наборами записей, объектами XML, объектами запроса или другими объектами. Если вам необходимо сохранить сложный тип данных в качестве клиентской переменной, вы можете использовать тег cfwddx для преобразования данных в формат WDDX (который представлен в виде строки), сохранить данные WDDX и использовать тег cfwddx для обратного преобразования данных. когда вы это читаете. Дополнительные сведения об использовании WDDX см. в разделе Использование WDDX.

http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSc3ff6d0ea77859461172e0811cbec0c35c-7fd5.html

Итак... WDDX или JSON подойдут.

person Henry    schedule 05.05.2016
comment
В данном случае это не должно быть проблемой. IIRC, CF будет рассматривать user.id как имя ключа, то есть строку, а не структуру. Таким образом, и имя ключа, и значение являются простыми объектами. - person Leigh; 06.05.2016
comment
В самом деле? тогда, возможно, он может попробовать client["user.authenticated"]. Я никогда не использовал клиентское хранилище. Сообщение об ошибке, которое он опубликовал, действительно похоже на то, что CF ищет объект user из области client. - person Henry; 06.05.2016
comment
Честно говоря, я давно ими не пользовался, но это мои воспоминания. Если бы эта тема не всплыла, я, вероятно, не вспомнил бы (или не ожидал) ее после столь долгой работы с переменными сеанса ;-) - person Leigh; 06.05.2016
comment
Какая боль, чтобы преобразовывать и деконвертировать в wddx каждый раз, когда я читаю и записываю эти переменные. Я действительно не хочу переписывать весь свой код. У меня есть тонны сеансовых переменных в формате массива. Спасибо за ответ в любом случае. Я отмечу это как правильное. - person user460114; 06.05.2016
comment
@user460114 user460114 для массива вы не можете уйти, но для пользователя, если вы не рассчитываете на то, что он будет объектом с методами, может быть, вы можете сохранить точечную нотацию в качестве ключа? нравится client["user.authenticated"]=blah? - person Henry; 07.05.2016
comment
Хотя в любом случае вам, вероятно, придется изменить код. - person Leigh; 09.05.2016