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); } } }
このトピックの詳細については、次のリソースを参照してください:
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3