0

为了在 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 一样......

4

1 回答 1

2

#{cookie}指的是当前HTTP 请求的 cookie 。如果你添加一个新的 cookie,那么它只会出现在 HTTP 响应中,但是与这个 HTTP 响应相关联的 HTTP 请求当然还没有 cookie。它仅存在于后续请求中,具体取决于 cookie 的年龄。

在呈现 HTTP 请求的 HTTP 响应期间,您基本上需要在之后发送重定向以使 cookie 可用。

至于刷新问题,请求很可能是在浏览器缓存中重新执行的。

于 2012-07-20T03:50:22.680 回答