Как мой 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");