【问题标题】:Manipulating the HttpSession in a JSF ViewHandlerWrapper doesn't work在 JSF ViewHandlerWrapper 中操作 HttpSession 不起作用
【发布时间】:2010-08-09 13:52:59
【问题描述】:

在 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);
}

如您所见,我想在 Session 中添加一个 UUID。在调试器之后,我可以看到该属性保留在 Session 上,直到 servlet 容器的整个请求-响应周期完成。但是,在下一次调用时,“expectedToken”属性为空。

在进入“老派”(获取 HttpSession)之前,我尝试在会话上操作一个值对象,这会呈现相同的结果。更改已取消。

应该起作用吗(毕竟调用renderView时没有提交响应)?

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:

    尝试在没有娱乐的情况下进行会话

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

    【讨论】:

      【解决方案2】:

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

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

      对未来的提示,每当您需要从 JSF 引擎盖下获取原始 Servlet API 时,请问自己两次:我的做法是否正确?没有JSF-ish方式吗?几乎在所有情况下都有。如果无效,请在这里问:)

      【讨论】:

      • 好吧,正如我所说的“在上老学校之前”,我确实尝试过 JSF 方式......这也不起作用:(
      • 显然没有为后续请求维护会话。这可能有很多原因,重要的是:1) 域已更改,2) 上下文已更改,3) 客户端不支持 cookie,4) 会话以编程方式无效。
      • 事实证明,这里提供的所有版本以及我之前测试过的所有版本都可以正常工作。问题是我在错误的时间点读取了会话值,结果总是呈现“NULL”。 Apperantely 它必须在 RENDER_RESPONSE 之前和 UPDATE_MODEL_VALUES 之后阅读。我会接受这两个答案,因为你们让我确信在 ViewHandler 中向会话添加一些东西是没有错的。
      • 有趣。以前没见过。究竟是什么 JSF impl/version?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多