2011-04-05 54 views
19

我在JSF 1.2会话作用域Bean上有一个JSF表单。 我有一个“重置”按钮,使会话无效。如何在JSF中使用cookie

我试图使用cookie来记忆会话之间的会话编号(非JSF会话,但我的私人会话编号),但我失败了。 我的问题 - 正确的地方(一些监听器?Bean构造器?)初始化,检索并存储cookie。

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

谢谢!

回答

34

可以通过ExternalContext#getRequestCookieMap()

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

获得所有cookie当运行上的Servlet API之上JSF(这是在病例99.9%的真;)),地图值解析到javax.servlet.http.Cookie

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

在JSF 1.2,它缺乏JSF 2.0引入ExternalContext#addResponseCookie()方法,需要投(上当然Servlet API的顶部,只有当运行JSF)的ExternalContext#getResponse()HttpServletResponse,然后使用HttpServletResponse#addCookie()

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

+0

'addResponseCookie()'方法接受参数'String name,String value,Map properties'。我假设例如'javax.servlet.http.Cookie'的_maxAge_在属性中编码。有没有办法直接使用'Cookie'? – Thor 2012-08-04 14:27:46

+0

点击我答案中的'addResponseCookie()'链接。它指向了javadoc。 – BalusC 2012-08-04 14:36:42

+0

@BalusC,我必须得到所有的cookie才能得到一个特定的cookie,我不能直接得到一个特定的cookie吗? – 2012-11-07 08:28:05