Как мой WebApp может получить набор данных с помощью клапана Tomcat?

Я пытаюсь получить значение, заданное пользовательским Tomcat Valve, в компоненте поддержки (или сервлете) JSF2. Я не вижу, как это сделать, и я не могу найти примеры, используя Google.

ПРЕДПОСЫЛКИ: В моем веб-приложении JSF2 я должен добавить атрибут часового пояса для каждого пользователя. Самый простой способ реализовать это - добавить раскрывающийся список часовых поясов на страницу профиля пользователя, чтобы каждый пользователь мог выбрать подходящий часовой пояс. Однако это может быть автоматизировано, потому что немного JavaScript в браузере может автоматически вычислять часовой пояс.

Поэтому я добавил новый параметр на мою страницу входа в Tomcat, который предоставляет это значение, которое веб-приложение может зафиксировать во время входа в систему. Механизм проверки подлинности формы Tomcat отвечает за обработку страницы входа (через HTTP POST для j_security_check). Я реализовал фильтр сервлетов Java EE, чтобы поймать это, но механизм входа в систему Tomcat обходит фильтры, поэтому этот код никогда не увидит POST для j_security_check.

Я теперь реализовал Tomcat Valve, и я могу успешно перехватить POST для j_security_check. В коде я извлекаю значение часового пояса и помещаю его... где?

Я понимаю, что клапан (который должен быть помещен в TOMCAT_HOME/lib) имеет загрузчик классов, отличный от моего обычного кода JSF2. Это означает, что я не могу получить доступ к статическим элементам клапана из моего кода JSF2.

Так вдохновленный исходным кодом для стандартных клапанов Tomcat, я попробовал это в клапане:

final org.apache.catalina.Session session = request.getSessionInternal(true);
session.setNote("com.conexa.timezoneOffset", timezoneOffset);

Однако в моих управляемых компонентах JSF2 я не могу получить ссылку на org.apache.catalina.Session.

Этот код возвращает объект типа StandardSessionFacade, который не позволяет мне получить org.apache.catalina.Session.

.. FacesContext.getCurrentInstance () getExternalContext() getSession(ложь);

Работая в режиме отладки, я смог найти org.apache.catalina.Session, но поле 'notes' на самом деле пустое.

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

Есть ли у гуру Tomcat какие-нибудь яркие идеи? Решение для простых сервлетов также будет приемлемым, потому что я уверен, что смогу его адаптировать.

1 ответ

Решение

Хорошо понял!

В коде клапана:

final HttpSession session = request.getSession(true);
session.setAttribute("timezoneOffset", timezoneOffset);

В коде JSF2:

final ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
final String timezoneOffsetStr = "" + externalContext.getSessionMap().get("timezoneOffset");
Другие вопросы по тегам