1

この質問は、私が最近投稿した別の質問に関連しています:JSFのHttpServletRequestとCookieについて

でRememberMeログインを実装するためにJSF、Cookieを使用してを読み込んでいWebFilterます。フィルタはCookieを取得し、Cookieの値をに設定しますSessionScoped ManagedBeanが、何らかの理由でManagedBeanWebページに表示できません。

フィルタのdoFilter実装:

@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;
    Cookie[] cookies = req.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("MyTestCookie")) {
                System.out.println("Filter got cookie: " + cookie.getValue());
                cookieBean.setValue(cookie.getValue());
            }
        }
    }
    chain.doFilter(request, response);
}

CookieBeanクラス:

@ManagedBean
@SessionScoped
public class CookieBean implements Serializable {

    private String value;

    @PostConstruct
    public void init() {
        System.out.println("Instantiated CookieBean");
    }

    public String getValue() {
        System.out.println("CookieBean returning Value: " + value);
        return value;
    }

    public void setValue(String value) {
        System.out.println("CookieBean getting Value: " + value);
        this.value = value;
    }

    public void create() {
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        Map<String, Object> props = new HashMap<String, Object>();
        props.put("maxAge", 10000);
        ec.addResponseCookie("MyTestCookie", "Hello Cookie", props);
    }    
}

CookieBean cookieBeanjavax.inject.Inject注釈によってフィルターに注入されます。

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: #{cookieBean.value}" /> 
</h:form>

最初の問題は、Cookieを設定した後、(新しいブラウザセッションを開いて)新しいセッションを開始すると、ページが表示された後SessionScoped ManagedBeanに更新されるため、WebページがCookieの値を認識しないことです。

質問1rendered : Webページの属性を更新するのに間に合うようにCookie値を検出するにはどうすればよいですか?

2番目の問題は、ブラウザのリロード(または更新)ボタンを押してWebページをリロードすると、ManagedBeanインスタンスは以前と同じですが(@PostConstructメソッドは起動されません)、WebページにnullCookieが表示されることです。値と同じものがサーバーの出力に表示されます。

CookieBean returning Value: null
Filter got cookie: Hello Cookie
CookieBean getting Value: Hello Cookie

質問2SessionScoped ManagedBean :再作成せずに損失がそのプロパティを失う可能性はどのようにありますか?

4

1 に答える 1

0

質問1への回答:この質問に対して受け入れられた回答で説明されているように、私は単にバッキングBeanでリダイレクトを実行する必要がありました。これにより、JSFはCookieを含む新しいGETリクエストを生成します。リクエストしているページが私のウェルカムページであるとすると、これを自分のcookieBean:に書き込む必要がありました。

FacesContext.getCurrentInstance().getExternalContext().redirect("faces/index.xhtml");

これはうまく機能しますが、完全なURLがアドレスバーに表示されるようになりました。これを回避する方法があるかどうか、さらに調査します。

質問2への回答SessionScoped cookieBean展開中に1つ、フィルターによって1つ、合計2回効果的にインスタンス化されました。問題は、JSF ManagedBeanを使用していて、javax.inject.Injectアノテーションを付けて挿入していたことです。javax.inject.Namedアノテーションを使用してCDIBeanjavax.enterprise.context.SessionScopedにしましたが、インジェクションは正常に機能しています。

于 2012-07-26T13:35:50.000 に答える