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 サイトの他の関連記事を参照してください。