为了在JSF中创建“记住我”登录,我试图了解Cookie的工作原理。我使用JSF创建了一个全新的Web应用程序,这个bean创建了一个与会话过期的Cookie:
CookieBean 类
@ManagedBean
@ViewScoped
public class CookieBean implements Serializable {
public void create() {
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.addResponseCookie("MyTestCookie", "Hello Cookie", null);
}
}
和 index.xhtml 有这个主体:
<h:form>
<h:commandButton value="Create Cookie!" action="#{cookieBean.create()}" >
<f:ajax render="@form" />
</h:commandButton>
<p></p>
<h:outputText value="Cookie value: #{cookie['MyTestCookie'].value}" />
</h:form>
因此,当页面首次加载时,没有正确的cookie,因为它是应用程序第一次运行,并且没有cookie。
单击按钮一次后,不会显示任何cookie。为什么?该按钮调用cookieBean#create()
方法,ajax标记应强制重新评估outputText
组件。这应该生成一个HttpSerlvetRequest
与cookie ...或不?只有在我再次按下按钮后才会显示cookie!
更令人惊讶的是,当我按下浏览器的refresh
按钮时,cookie没有显示,虽然我希望看到它,因为较旧的会话仍然存在。
就像是(重新)加载页面不会向服务器发送HttpServletRequest ...
答案 0 :(得分:2)
#{cookie}
是指当前HTTP请求的Cookie。如果添加新cookie,则它仅出现在HTTP响应上,但与此HTTP响应关联的HTTP请求当然没有cookie。它仅出现在后续请求中,具体取决于cookie的年龄。
您基本上需要发送重定向,以便在呈现HTTP请求的HTTP响应期间使cookie可用。
关于刷新问题,请求很可能在浏览器缓存中重新执行。