【发布时间】:2011-04-05 19:56:27
【问题描述】:
我有一个基于 JSF 1.2 Session Scope Bean 的 JSF 表单。 我有一个“重置”按钮,它使会话无效。
我尝试使用 cookie 来记住会话之间的会话编号(不是 JSF 会话,而是我的私人会话编号),但我失败了。 我的问题 - 初始化、检索和存储 cookie 的正确位置(某个侦听器?Bean 构造函数?)在哪里。
寻找最好的方法来做到这一点。
谢谢!
【问题讨论】:
我有一个基于 JSF 1.2 Session Scope Bean 的 JSF 表单。 我有一个“重置”按钮,它使会话无效。
我尝试使用 cookie 来记住会话之间的会话编号(不是 JSF 会话,而是我的私人会话编号),但我失败了。 我的问题 - 初始化、检索和存储 cookie 的正确位置(某个侦听器?Bean 构造函数?)在哪里。
寻找最好的方法来做到这一点。
谢谢!
【问题讨论】:
您可以通过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<String,Object> properties。我假设例如javax.servlet.http.Cookie 的 maxAge 编码在属性中。有没有办法直接使用Cookie?
addResponseCookie()链接。它指向 javadoc。
getRequestCookieMap()?我不确定这究竟是如何形成问题的。 cookie 已经预先在地图中进行了解析和收集。这不会每次都发生。如果您想要更方便的方法,可以查看OmniFaces 的Faces#getRequestCookie() 方法。