JSF で「Remember me」ログインを作成するために、Cookie の仕組みを理解しようとしています。セッションで期限切れになる Cookie を作成するこの Bean を使用して、JSF を使用してまったく新しい Web アプリケーションを作成しました。
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 が存在しないためです。
ボタンを 1 回クリックした後、Cookie は表示されません。なんで?ボタンはcookieBean#create()
メソッドを呼び出し、ajax タグはoutputText
コンポーネントの再評価を強制する必要があります。そして、これはHttpSerlvetRequest
クッキーで生成する必要があります...かどうか?ボタンをもう一度押すと、Cookie が表示されます。
さらに驚くべきことにrefresh
、ブラウザーのボタンを押しても、古いセッションがまだ生きているため、Cookie が表示されるはずですが、表示されません。
ページを(再)ロードしても HttpServletRequest がサーバーに送信されないようなものです...