JSF アプリケーションにカスタム認証メカニズムを実装する場合、ページ ナビゲーションとフォーム送信の違いを理解することが重要です。リダイレクトはページ ナビゲーションにはシームレスに機能しますが、フォーム送信中に問題が発生する可能性があります。
この問題の根本原因は、JSF フォーム送信によって非同期リクエストがトリガーされるという事実にあります。リダイレクトが非同期リクエストへの応答として送信されると、JSF AJAX エンジンは特定の XML 応答を期待します。ただし、通常の HTML ページを送信するとこの期待に反し、ユーザーは同じページに留まる結果になります。
認可チェックを実行するためにカスタム サーブレットを使用すると、さらに複雑になります。そして潜在的な問題。代わりに、この目的のために特別に設計されたサーブレット フィルターを利用することをお勧めします。フィルタは、受信リクエストをインターセプトする、より堅牢かつ効率的な手段を提供します。
以下は、認可チェックを効果的に処理するサーブレット フィルタの例です。
@WebFilter("/*") public class AuthorizationFilter implements Filter { private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<partial-response><redirect url=\"%s\"></redirect></partial-response>"; @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. chain.doFilter(request, response); } else if (ajaxRequest) { // Send special XML response to instruct JSF AJAX to redirect. response.setContentType("text/xml"); response.setCharacterEncoding("UTF-8"); response.getWriter().printf(AJAX_REDIRECT_XML, loginURL); } else { // Perform стандартный синхронный редирект. response.sendRedirect(loginURL); } } }
このトピックの詳細については、次のリソースを参照してください:
以上がJSF フォーム送信時の認証エラーを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。