カスタム FacesServlet を使用すると、JSF フォームの送信時に認可リダイレクトが失敗するのはなぜですか?

Barbara Streisand
リリース: 2024-11-03 01:51:29
オリジナル
257 人が閲覧しました

Why does Authorization Redirect Fail on JSF Form Submissions When Using a Custom FacesServlet?

JSF フォーム送信でのセッション期限切れ時の承認リダイレクト

問題:

JSF 内このアプリケーションでは、認証チェックを実行し、ログインしていない場合にユーザーをログイン ページにリダイレクトするために、カスタム FacesServlet が実装されています。これは、ページ ナビゲーション中は期待どおりに機能しますが、JSF フォームが送信されると、リダイレクトは失敗し、ユーザーは同じままになります。 page.

原因:

この問題は、JSF コマンド リンク/ボタンが XML 応答を期待する Ajax リクエストをトリガーするために発生します。ただし、sendRedirect() メソッドは、Ajax エンジンが解釈できない通常の HTML ページを送信します。その結果、リダイレクトは実行されず、ページは変更されないままになります。

解決策:

1.サーブレット フィルターを使用します:

カスタム サーブレットを使用する代わりに、サーブレット フィルターを認証チェックに使用する必要があります。これは、タスクにより適したものとなるため、推奨されるアプローチです。

2. Ajax リクエストを別の方法で処理する:

フィルターで、Ajax リクエストを別個に処理します。リダイレクトを送信する代わりに、JSF Ajax エンジンにリダイレクトの実行を指示する特別な XML 応答を送信します。

フィルターの例:

<code class="java">import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class AuthorizationFilter implements Filter {

    private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
        "<partial-response><redirect url=\"%s\"></redirect></partial-response>";

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

        String loginURL = request.getContextPath() + "/login.xhtml";

        boolean loggedIn = (session != null) && (session.getAttribute("user") != null);
        boolean ajaxRequest = "partial/ajax".equals(request.getHeader("Faces-Request"));

        if (loggedIn || ajaxRequest) {
            chain.doFilter(request, response);
        } else if (ajaxRequest) {
            response.setContentType("text/xml");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().printf(AJAX_REDIRECT_XML, loginURL);
        } else {
            response.sendRedirect(loginURL);
        }
    }
}</code>
ログイン後にコピー

次の手順に従います。 、認可リダイレクト機能は、ページ ナビゲーションと JSF フォーム送信の両方に対して正しく実装できます。

以上がカスタム FacesServlet を使用すると、JSF フォームの送信時に認可リダイレクトが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート