Манипулирование HttpSession в JSF ViewHandlerWrapper не работает - PullRequest
1 голос
/ 09 августа 2010

В реализации ViewHandlerWrapper у меня есть следующий код:

public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
    final String token = UUID.randomUUID().toString();

    HttpSession httpSession = (HttpSession) context.getExternalContext().getSession(true);
    httpSession.setAttribute("expectedToken", token);

    getWrapped().renderView(context, viewToRender);
}

Как видите, я хочу добавить UUID в сеанс. После отладчика я вижу, что атрибут остается в сеансе, пока не завершится весь цикл запрос-ответ контейнера сервлета. Однако при следующем вызове атрибут «Ожидаемый токен» будет нулевым.

Прежде чем перейти к "старой школе" (выбирая HttpSession), я попытался манипулировать объектом значения в сеансе, что дало тот же результат. Изменение было отклонено.

Это не должно работать (в конце концов, ответ не фиксируется при вызове renderView)?

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Попробуйте получить сеанс без отдыха

HttpSession httpSession = (HttpSession) context.getExternalContext().getSession(false);
1 голос
/ 09 августа 2010

Скорее используйте предоставленную JSF ExternalContext#getSessionMap().Это, в свою очередь, прозрачно подкреплено сеансом HTTP.

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.getSessionMap().put("key", "value");

Подсказка на будущее, всякий раз, когда вам нужно вытащить необработанный Servlet API из-под колпака JSF, спросите себя дважды:правильно?Есть ли способ JSF-иш?Почти во всех случаях есть.Если напрасно, просто спросите здесь:)

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