5

外部ページにデータを投稿する JSF ページがあります。データは、投稿データで一意の ID を生成する JSF マネージド Bean からロードされます。

ユーザーがチェックアウト ボタンをクリックしてから同じページに戻り、チェックアウト ボタンをもう一度押すという問題があります。投稿データが更新されていません。さらに、Bean はまったく呼び出されません。JSFにページとフォームデータを強制的にリロードさせる方法はありますか?

<form action="#{checkoutBean.externalUrl}" method="post"
    id="payForm" name="payForm">
       <input type="hidden" value="#{checkoutBean.uniqueID}" />
       <input type="submit" value="Proceed to Checkout" />
</form>
4

2 に答える 2

10

そのページは、ブラウザのキャッシュから読み込まれている可能性があります。これは本質的には無害ですが、実際にはエンドユーザーを混乱させます。なぜなら、エンドユーザーはそれが実際にサーバーから来ていると誤って考えているからです。これは、ブラウザーの Web 開発者ツールセットで HTTP トラフィック モニターを見ることで簡単に確認できます (Chrome/FireFox23+/IE9+ で F12 を押して、[ネットワーク] セクションを確認します)。

基本的に、(動的) JSF ページをキャッシュしないようにブラウザーに指示する必要があります。このようにして、ブラウザは、キャッシュから以前に要求されたものを表示するのではなく、実際にページのサーバーを要求します (これによりマネージド Bean などの適切な作成/初期化がトリガーされます)。

一般に、これは次のような単純なサーブレット フィルターで実行されます。

@WebFilter("/app/*")
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        if (!request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            response.setDateHeader("Expires", 0); // Proxies.
        }

        chain.doFilter(req, res);
    }

    // ...
}

/app/*ブラウザのキャッシュをオフにする URL パターンの例はどこにありますか。必要に応じて/**.xhtmlまたはにマッピングすることもできservletNames={"Faces Servlet"}ます。

JSF ユーティリティ ライブラリOmniFacesCacheControlFilterを使用している場合は、次のエントリを に追加するだけで組み込みを使用できますweb.xml(これは、 の直接マッピングを示していFacesServletます。つまり、すべての動的 JSF ページはキャッシュされません)。

<filter>
    <filter-name>noCache</filter-name>
    <filter-class>org.omnifaces.filter.CacheControlFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>noCache</filter-name>
    <servlet-name>facesServlet</servlet-name>
</filter-mapping>

ショーケースもご覧ください。

于 2012-12-31T14:26:33.980 に答える
5

サーブレットフィルターを作成しなくても JSF で機能するソリューションを見つけました。以下の行を .xhtml ページに挿入するだけです。

<f:event type="preRenderView" listener="#{facesContext.externalContext.response.setHeader('Cache-Control', 'no-cache, no-store')}" />
于 2016-04-07T11:45:40.307 に答える