ホームページ  >  記事  >  Java  >  セッション有効期限切れ時の認可リダイレクトが、JSF でのページ ナビゲーションとフォーム送信で異なる動作をするのはなぜですか?

セッション有効期限切れ時の認可リダイレクトが、JSF でのページ ナビゲーションとフォーム送信で異なる動作をするのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-27 17:14:31651ブラウズ

Why does Authorization Redirect on Session Expiration Behave Differently for Page Navigation and Form Submit in JSF?

セッション有効期限切れ時の認可リダイレクト: ページ ナビゲーションとフォーム送信の間で異なる結果

認可とセッション管理を実装するために FacesServlet をカスタマイズするのは一般的ですJSF アプリケーションで練習します。ただし、セッション有効期限のリダイレクトがページ ナビゲーションとフォーム送信で異なる動作をするという特有の問題が発生します。

問題の説明

カスタム FacesServlet を使用して承認とリダイレクトを確認する場合権限のないユーザーの場合、JSF フォームが送信されたときにリダイレクト応答が有効になりません。サーブレットのリダイレクト コマンドにもかかわらず、ページは変更されません。

違いを理解する

ページ ナビゲーションとフォーム送信の動作の違いは、リクエストのタイプにあります。送信。ページ ナビゲーションには通常の HTTP リクエストが含まれますが、JSF フォームの送信では AJAX リクエストがトリガーされます。

Ajax および XML レスポンス

AJAX リクエストは XML レスポンスを必要とします。リダイレクトが AJAX 応答として送信される場合、AJAX エンジンはリクエストをリダイレクト URL に再送信します。リダイレクト URL は必要な XML ではなく HTML ページを返すため、ブラウザは応答を適切に処理できません。

より良いソリューションとしてのフィルタ

FacesServlet を変更した場合、この認可シナリオにはサーブレット フィルターの方が適したアプローチです。フィルタはリクエストがサーブレットに到達する前にインターセプトできるため、セキュリティとセッション処理にとって理想的な選択肢となります。

フィルタの実装例

以下は、サーブレット フィルタの例です。認可とセッション有効期限の処理を実装します:

<code class="java">@WebFilter("/*")
public class AuthorizationFilter implements Filter {

    // ...

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        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 loginRequest = request.getRequestURI().equals(loginURL);
        boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER + "/");
        boolean ajaxRequest = "partial/ajax".equals(request.getHeader("Faces-Request"));

        if (loggedIn || loginRequest || resourceRequest) {
            // Continue request without intervention
            chain.doFilter(request, response);
        } else if (ajaxRequest) {
            // Send an AJAX-style redirect response
            response.setContentType("text/xml");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().printf(AJAX_REDIRECT_XML, loginURL);
        } else {
            // Perform standard synchronous redirect
            response.sendRedirect(loginURL);
        }
    }
}</code>

以上がセッション有効期限切れ時の認可リダイレクトが、JSF でのページ ナビゲーションとフォーム送信で異なる動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。