在JSF ViewHandlerWrapper中操作HttpSession不起作用

时间:2010-08-09 13:52:59

标签: java jsf jsf-2

在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。在调试器之后,我可以看到该属性保留在Session上,直到servlet容器的整个请求 - 响应周期完成。但是,在下次调用时,“expectedToken”属性为null。

在进入“旧学校”(获取HttpSession)之前,我试图在会话中操作一个值对象,这会产生相同的结果。这一变化被驳回了。

这个不是是否可以工作(毕竟,调用renderView时没有提交响应)?

2 个答案:

答案 0 :(得分:2)

尝试获取没有重新创建的会话

HttpSession httpSession = (HttpSession) context.getExternalContext().getSession(false);

答案 1 :(得分:1)

而是使用JSF提供的ExternalContext#getSessionMap()。这反过来又被HTTP会话透明地支持。

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

未来的暗示,无论何时你需要从JSF引擎盖下运输原始的Servlet API,都要问自己两次:我是以正确的方式做到的吗?是不是有JSF-ish方式?在几乎所有情况下都有。如果徒劳无功,请在这里问:)

相关问题