【问题标题】:How to use cookies in JSF如何在 JSF 中使用 cookie
【发布时间】:2011-04-05 19:56:27
【问题描述】:

我有一个基于 JSF 1.2 Session Scope Bean 的 JSF 表单。 我有一个“重置”按钮,它使会话无效。

我尝试使用 cookie 来记住会话之间的会话编号(不是 JSF 会话,而是我的私人会话编号),但我失败了。 我的问题 - 初始化、检索和存储 cookie 的正确位置(某个侦听器?Bean 构造函数?)在哪里。

寻找最好的方法来做到这一点。

谢谢!

【问题讨论】:

    标签: session jsf cookies


    【解决方案1】:

    您可以通过ExternalContext#getRequestCookieMap()获取所有cookie

    Map<String, Object> cookies = externalContext.getRequestCookieMap();
    // ...
    

    在 Servlet API 之上运行 JSF 时(在 99.9% 的情况下都是如此;)),映射值解析为 javax.servlet.http.Cookie

    Cookie cookie = (Cookie) cookies.get(name);
    // ...
    

    在缺少 JSF 2.0 引入的 ExternalContext#addResponseCookie() 方法的 JSF 1.2 中,您需要将 ExternalContext#getResponse() 强制转换为 HttpServletResponse(当然,仅当在 Servlet API 之上运行 JSF 时),然后使用 @987654326 @。

    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
    Cookie cookie = new Cookie(name, value);
    cookie.setMaxAge(maxAge); // Expire time. -1 = by end of current session, 0 = immediately expire it, otherwise just the lifetime in seconds.
    response.addCookie(cookie);
    

    您可以在您想要的 JSF 上下文中的任何位置执行此操作,正确的位置取决于唯一的功能需求。您只需要确保在响应已提交时不添加 cookie,否则会导致 IllegalStateException

    【讨论】:

    • 方法addResponseCookie()接受参数String name, String value, Map&lt;String,Object&gt; properties。我假设例如javax.servlet.http.CookiemaxAge 编码在属性中。有没有办法直接使用Cookie
    • 点击我的回答中的addResponseCookie()链接。它指向 javadoc。
    • @BalusC,我是否必须获取所有 cookie 才能获取特定 cookie,我不能直接获取特定 cookie 吗?
    • @Mahmoud:你说的是getRequestCookieMap()?我不确定这究竟是如何形成问题的。 cookie 已经预先在地图中进行了解析和收集。这不会每次都发生。如果您想要更方便的方法,可以查看OmniFacesFaces#getRequestCookie() 方法。
    猜你喜欢
    • 2014-01-22
    • 2019-06-27
    • 2013-05-09
    • 2015-02-05
    • 2011-10-14
    • 2011-03-09
    • 2012-01-29
    • 2012-07-21
    • 1970-01-01
    相关资源
    最近更新 更多