Как я могу получить HttpServletRequest, когда в HttpSessionListener? - PullRequest
6 голосов
/ 05 июня 2009

Как я могу получить доступ к заголовкам запросов из SessionListener?

Мне нужно установить тайм-аут в текущем сеансе при его создании. Время ожидания должно меняться в зависимости от заголовка в HttpServletRequest. У меня уже есть SessionListener (реализует HttpSessionListener), который регистрирует создание и уничтожение новых сессий, и это, кажется, наиболее логичное место для установки тайм-аута.

Я пробовал следующее, но он всегда устанавливает ctx на ноль.

FacesContext ctx = FacesContext.getCurrentInstance();

Ответы [ 3 ]

8 голосов
/ 05 июня 2009

HttpSessionListener не имеет доступа к запросу, потому что он вызывается, когда не было сделано ни одного запроса - для уведомления о разрушении сеанса.

Таким образом, Filter или Servlet были бы лучшими местами для проверки запроса и указания времени ожидания сеанса.

2 голосов
/ 05 июня 2009
FacesContext ctx = FacesContext.getCurrentInstance();

Контексты JSF являются индивидуальными для каждого запроса и локальными для потока. Таким образом, этот вызов метода, вероятно, вернет значение null вне вызовов контроллера JSF (например, FacesServlet.service ), то есть другие потоки и любые запросы, которые не проходят через отображение сервлета Faces.

Технически возможно установить это время ожидания с помощью механизма JSF - вы можете использовать фазовый слушатель , чтобы проверить сеанс после RENDER RESPONSE , хотя вы все равно будете иметь приведение к сервлету API для установки времени ожидания. Преимущество фазовых прослушивателей состоит в том, что они могут быть зарегистрированы либо глобально в face-config ( см. Спецификацию ), либо для конкретных видов . Глобальный прослушиватель фазы, определенный в JAR с META-INF /face-config.xml , может быть разбит на несколько WAR, что позволяет вам легко повторно использовать функциональность.

(Вы также можете переопределить, как сеанс предоставляется JSF , но объем работы чрезмерен.)

Для одноразового предложения Эриксона Filter действительно просто.

1 голос
/ 05 июня 2009

Вы не можете (см. API ). Запрос позволяет получить доступ к сеансу, но не наоборот.

Возможно, у вас даже есть одновременные запросы на один и тот же сеанс, поэтому это невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...