不適切な実装により、JSF フォーム送信で承認リダイレクトが失敗する
JSF でカスタム承認を実装する場合、正しいツールと方法。この場合、カスタム FacesServlet は認可チェックの処理には適していません。
この問題は、カスタム FacesServlet が JSF コマンド リンク/ボタンの送信を含むすべてのリクエストをインターセプトするために発生します。ただし、これらの送信は多くの場合、AJAX リクエストをトリガーし、JSF Ajax エンジンにページのリダイレクトを指示する特定の XML レスポンスを期待します。
AJAX リクエストにリダイレクト ヘッダーを送信することで、カスタム FacesServlet は事実上、レスポンスを無効にします。その結果、ページは変更されません。代わりに、ブラウザをリダイレクトする特別な XML 応答を返す必要があります。
さらに、承認にカスタム FacesServlet を使用することは一般に推奨されません。サーブレット フィルタは、このタスクを処理するためのより適切なメカニズムです。これにより、柔軟性が向上し、JSF 処理を担当する FacesServlet との潜在的な競合が回避されます。
サーブレット フィルターを使用した正しい実装
サーブレット フィルターは次のように構成できます。すべてのリクエストの前に介入して、認可チェックを有効にします。次の例を考えてみましょう。
<code class="java">@WebFilter("/*") public class AuthorizationFilter implements Filter { // Generate XML response for AJAX redirects private static final String AJAX_REDIRECT_XML = "..."; @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ... { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); // Define authorization flags boolean loggedIn = ...; boolean loginRequest = ...; boolean resourceRequest = ...; boolean ajaxRequest = ...; // Handle authorization and redirection if (loggedIn || loginRequest || resourceRequest) { // Continue request chain.doFilter(request, response); } else if (ajaxRequest) { // Return XML response for AJAX redirects response.getWriter().printf(AJAX_REDIRECT_XML, loginURL); } else { // Perform synchronous redirect response.sendRedirect(loginURL); } } }</code>
このフィルタは、認可に対するきめ細かい制御を提供し、標準リクエストと AJAX リクエストの両方が正しく処理されることを保証し、必要に応じてユーザーをログイン ページにリダイレクトします。
以上がJSF フォームの送信時に認証リダイレクトが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。