了解JSF中的HttpServletRequest和cookie

时间:2012-07-19 18:41:41

标签: jsf java-ee cookies

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

1 个答案:

答案 0 :(得分:2)

#{cookie}是指当前HTTP请求的Cookie。如果添加新cookie,则它仅出现在HTTP响应上,但与此HTTP响应关联的HTTP请求当然没有cookie。它仅出现在后续请求中,具体取决于cookie的年龄。

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

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