0

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 がサーバーに送信されないようなものです...

4

1 に答える 1

2

は、現在の HTTP リクエスト#{cookie}の Cookie を参照します。新しい Cookie を追加すると、それは HTTP 応答にのみ表示されますが、この HTTP 応答に関連付けられている HTTP 要求にはもちろんまだ Cookie がありません。Cookie の経過時間に応じて、後続のリクエストにのみ存在します。

基本的に、HTTP 要求に対する HTTP 応答のレンダリング中に Cookie を使用できるようにするために、後でリダイレクトを送信する必要があります。

更新の問題に関しては、ブラウザのキャッシュでリクエストが再実行された可能性が最も高いです。

于 2012-07-20T03:50:22.680 に答える