そのページは、ブラウザのキャッシュから読み込まれている可能性があります。これは本質的には無害ですが、実際にはエンドユーザーを混乱させます。なぜなら、エンドユーザーはそれが実際にサーバーから来ていると誤って考えているからです。これは、ブラウザーの 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>
ショーケースもご覧ください。