Thymeleaf: случайная ошибка при использовании #session — Exception вычисления выражения SpringEL

#thymeleaf #cas

#thymeleaf #cas

Вопрос:

Мы используем Spring webflow ThymeLeaf и пытаемся получить доступ к session.getAttribute() на html-странице.

Немного новичок в Thymeleaf, и я понимаю, что у Thymeleaf есть 2 способа решения проблемы сеанса, а именно. ${session.something} и ${#session.getAttribute(‘что-то’)}.

Используемый нами код примерно такой, как показано ниже, который иногда дает сбой.

 <div th:if="${(#session.getAttribute('booleanAttribute'))}">  
...
</div>
  

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

 org.thymeleaf.exceptions.TemplateProcessingException:  Exception evaluating SpringEL expression: "(#session.getAttribute('booleanAttribute'))" (template: "base" - line 80, col 10)
  

Я немного неохотно размещаю проверки null, чтобы увидеть, является ли (#session) null или нет, не понимая, почему локально работает нормально. Итак, у меня есть этот вопрос —

Что может быть неправильным выше и как я могу воспроизвести локально, чтобы я мог подтвердить, что исправление, которое я размещаю, будет работать во всех средах?

Ответ №1:

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

#session : прямой доступ к javax.servlet.http.Объект HttpSession, связанный с текущим запросом.

В моем тестировании #session равно нулю по истечении сеанса. В случаях, когда у пользователя истек срок действия сеанса, использование #session выдаст исключение с нулевой точкой ( Method call: Attempted to call method getAttribute(java.lang.String) on null context object ). Вы должны иметь возможность проверить это, удалив свой JSESSIONID cookie.

${session} с другой стороны, это SessionAttributesMap , которое, по-видимому, никогда не имеет значения null — даже когда нет допустимого сеанса. В этом случае выражение ${session.booleanAttribute} все равно будет работать, просто вычислите значение false.