これは、制限されたページがブラウザによってキャッシュされていることが原因です。
コンテナー管理のセキュリティは、認証チェックをトリガーした最後の HTTP 要求にリダイレクトします。あなたの場合、それはどうやら自動的に含まれる PrimeFaces テーマ CSS ファイルです。これは、ブラウザが認証対象のページをブラウザのキャッシュから完全にロードした場合、ブラウザがサーバー側から CSS ファイルを完全にロードした場合、または条件付き GET 要求によって CSS ファイルのキャッシュの有効性をテストした場合に発生する可能性があります。 . コンテナ管理のセキュリティは、この URL をログイン成功後のリダイレクト URL として正確に記憶します。
<h:outputScript>
JSF リソース (と<h:outputStylesheet>
を認証チェックから除外したいと考えています。<h:graphicImage>
共通の URL パターン/javax.faces.resource/*
.
<security-constraint>
<web-resource-collection>
<web-resource-name>Allowed resources</web-resource-name>
<url-pattern>/javax.faces.resource/*</url-pattern>
</web-resource-collection>
<!-- No Auth Contraint! -->
</security-constraint>
また、ブラウザーが制限付きページをキャッシュからロードしないようにブラウザーに指示する必要があります(たとえば、ログアウト後に [戻る] ボタンを押すなど)。の 1 つと同じ URL パターンに次のフィルターをマップします<security-constraint>
。
@WebFilter("/secured/*") // Use the same URL pattern as <security-constraint>
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);
}
// ...
}
これにより、「戻るボタン」の問題も修正されることに注意してください。そのため、エンドユーザーは、現在のセットアップで発生するように、サインアウト/ログアウト後に戻るボタンが押されたときに、制限されたページも表示されなくなります。