2016-10-06 2 views
0

Ошибки я получаю это:Сессия не является структурой?

Element USER is undefined in a Java object of type class [Ljava.lang.String;

Строки коды я получаю эту ошибку будет, когда я делаю что-то вроде этого:

SESSION.user.functionName()

Пришло случайно, и я полагаю, что происходит после окончания сеанса пользователя. Моя проблема в первую очередь заключается в том, что область SESSION всегда является структурой? Как/почему ColdFusion считает, что это строка.

Независимо от этого, моя основная проблема в том, что я использую CFWheels. Все мои контроллеры, конечно, расширяют основной Controller.cfc, и все мои контроллеры (кроме публичного) фильтруют через функцию checkLogin. Эта функция имеет это в нем:

<cfif !structKeyExists(session, "user")> 
    <cfif !structKeyExists(params,'layout') || params.layout EQ true> 
       <cfset redirectTo(route="home",error="You must be logged in to continue.") /> 
    <cfelse> 
     <cfset flashInsert(error="You session has expired and you must login to continue. <a href=''>Reload the Page</a> to login.") /> 
     <cfset redirectTo(controller="Shared",action="ajaxError") /> 
    </cfif> 
</cfif> 

В этой части функции, я явно проверить, если user существует в session, и если это не так или другого я посылаю их куда-нибудь в другом месте. Как на самом деле код проходит мимо этой части, а затем сбой, когда session - это как-то строка?

Не говоря уже о том, что есть другие места, прежде чем я доберусь до строки ошибки, где я уверен, что различные вещи в объекте SESSION.user верны.

+0

(Изменить) В сообщении об ошибке говорится, что элемент 'user' является строкой, а не' session'. Предоставленные сообщения об ошибках не всегда на 100% точны. Это также может означать, что ключ вообще не существует. Вы получаете ту же ошибку из 'session.someKeyThatDoesNotExist.functionName()' – Leigh

+0

Разве это не означает, что 'user' не определено в объекте. Объектом является класс String? – Leeish

+0

Если вы правы, если я изменяю '' to ' '. Тем не менее, не имеет никакого смысла, как он мог пройти мимо других частей моего кода, используя методы в пользовательском объекте, просто чтобы получить представление, а затем провалиться, не так ли? – Leeish

ответ

0

Что происходило с запросами ajax. Некоторые ajax запрашивают отчеты о загрузке и могут потребоваться несколько секунд для запроса, особенно до того, как произойдет некоторое кэширование. Если пользователь выполняет вызов ajax и затем выходит из системы, технически запрос мог бы пройти через все мои проверки полномочий, чтобы добраться до контроллера (требуется всего миллисекунды), но в контроллере при извлечении данных из моделей пользователь вышел из системы.

Затем, когда представление будет готово к загрузке, сеанс очищается. Если я использую что-либо из области сеанса там, он ошибается.

Я думаю, что исправлю это, добавив фильтр, который запускается после действия контроллера, чтобы проверить, все ли существует область сеанса. Если это не так, я просто отменю запрос. У меня нет модели логики в любом из моих представлений, но я иногда ссылаюсь на методы в области SESSION.user. Наверное, не пурист MVC.

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

+0

Grrr ... казалось бы, после запуска фильтров после запуска представления. Не знаете, как это поймать. – Leeish

+0

Еще одна причина для минимизации использования переменных сеанса. –

+0

Вы можете поместить свой код для запуска после окончания сеанса в файле ../wheels/events/onsessionend.cfm. Это запустит ваш код в конце сеанса. Все значения в области сеанса доступны в области аргументов. –

 Смежные вопросы

  • Нет связанных вопросов^_^