在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时没有提交响应)?
答案 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方式?在几乎所有情况下都有。如果徒劳无功,请在这里问:)