これは、ajax によるリンク ナビゲーションを実行していて、ログイン後に返されたページがブラウザー キャッシュから提供された場合に発生する可能性があります (そのため、古いビュー ステート ID を持つフォームが含まれています)。制限されたページをキャッシュしないようにブラウザに指示する必要があります。これは、次のフィルターで実現できます。
@WebFilter(servletNames={"Faces Servlet"})
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
res.setDateHeader("Expires", 0); // Proxies.
}
chain.doFilter(request, response);
}
// ...
}
したがって、この問題は、ページ間のナビゲーションに (ajax) コマンド リンクを使用していることも示唆していることに注意してください。これは悪い習慣です。これらのリンクは、SEO フレンドリーでもブックマーク可能でもありません。コマンド リンクは、フォームの送信にのみ使用する必要があります。ページ間のナビゲーションには通常のリンクを使用します。h:commandLink の代わりに h:outputLink を使用する必要がある場合も参照してください。