1

私は JSF 2.0 の Flash スコープ (他のスコープのような「スコープ」ではないことはわかっていますが、「スコープ」と呼ばれることが多い) と格闘してきました。(モハラ)

私の問題は、フラッシュ Cookie がビューのパスにバインドされており、オブジェクトをフラッシュに配置していることです。
これにより、同じアプリケーション内の別のパスにリダイレクトした後、オブジェクトが使用できなくなります。リダイレクト ナビゲーションの反対側で文字列 (およびおそらくオブジェクト) を使用できるようにする必要があります。

これをオーバーライドし、次のラッパーに@WebFilter置き換える目的で実装しました。ServletResponse

private class ResponseWrapper extends HttpServletResponseWrapper{

    private final String path;

    public ResponseWrapper(HttpServletResponse response, String contextpath) {
        super(response);
        this.path = contextpath;
    }

    @Override
    public void addCookie(Cookie cookie) {

        // Hardcoded name from jsf-impl # com.sun.faces.context.flash.ELFlash  
        final String FLASH_COOKIE_NAME = "csfcfc";

        if (cookie.getName().equals(FLASH_COOKIE_NAME)){
            cookie.setPath(path);
        }
        super.addCookie(cookie);
    }

}

実際には、このラッパーは、アプリケーションの context-root にバインドされるように flash-cookies を変更します。

私の質問は、これが私が監督していない他の問題を引き起こすかどうかです. そもそもビューのパスにバインドする必要がある
理由を理解できません。Flash

4

2 に答える 2

2

あなたの仮定の 1 つが正しくありません。

フラッシュクッキーがビューのパスにバインドされ、オブジェクトがフラッシュされます。

結局のところ、Flash スコープはリダイレクトを 1 回だけ存続します。

つまり、Flash スコープに配置されたオブジェクトは、リダイレクト後も存続します。 http://mkblog.exadel.com/2010/07/learning-jsf2-using-flash-scope/

Cookie やフィルターをいじっている場合は、おそらく何か間違ったことをしている可能性があります。JSF はこれらの概念を抽象化するため、POJO を使用して作業を行うことができます。Java EE Cookie をいじらないでください。必要以上の作業を行うことになり、非常に脆弱なコードが即座に作成されます。

フラッシュ スコープを使用するには、次のように参照を取得します。

Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();

置く:

flash.put("myObject", myObject);

取得するため:

Object myObject = flash.get("myObject");

あなたのハッキングは JSF に問題を引き起こしますか? 今ではないにしても、後で Mojarra をアップグレードしたり、別のコンテナーを使用したり、MyFaces に切り替えたりするときに、確実に言えます。

于 2012-07-19T15:40:24.780 に答える
0

これは実際にはあなたの質問に答えるものではありませんが、この質問とメモを見ると、ポストが JSF2 フラッシュ スコープで値を設定した後、ページへの 2 番目の GET リクエストで再び表示されます (フラッシュ スコープは有害と見なされます)。

代わりにRenderScopedを使用する必要がありますか (該当する場合)。

于 2012-07-18T17:41:40.037 に答える