#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.