"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية التعامل مع فشل التفويض أثناء تقديم نموذج JSF؟

كيفية التعامل مع فشل التفويض أثناء تقديم نموذج JSF؟

تم النشر بتاريخ 2024-11-08
تصفح:285

How to Handle Authorization Failures During JSF Form Submissions?

فشل التفويض أثناء عمليات تقديم نموذج JSF: تحليل شامل

عند تنفيذ آليات الترخيص المخصصة في تطبيقات JSF، من الضروري فهم الفرق بين التنقل في الصفحة وعمليات إرسال النماذج . على الرغم من أن عمليات إعادة التوجيه تعمل بسلاسة للتنقل في الصفحة، إلا أنها قد تواجه مشكلات أثناء عمليات إرسال النماذج.

سبب المشكلة

يكمن السبب الجذري لهذه المشكلة في حقيقة أن عمليات إرسال نموذج JSF تؤدي إلى طلبات غير متزامنة. عندما يتم إرسال إعادة توجيه كاستجابة لطلب غير متزامن، يتوقع محرك JSF AJAX استجابة XML محددة. ومع ذلك، فإن إرسال صفحة HTML عادية ينتهك هذا التوقع، مما يؤدي إلى بقاء المستخدم على نفس الصفحة.

الأداة الخاطئة للمهمة

يؤدي استخدام servlet مخصص لإجراء فحوصات التفويض إلى تعقيد إضافي والقضايا المحتملة. بدلاً من ذلك، فإن النهج الموصى به هو استخدام مرشح servlet المصمم خصيصًا لهذا الغرض. توفر عوامل التصفية وسيلة أكثر قوة وفعالية لاعتراض الطلبات الواردة.

تنفيذ عامل تصفية شامل

فيما يلي مثال لمرشح servlet الذي يتعامل مع عمليات فحص التفويض بشكل فعال:

@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 2.0 / Facelets، هل هناك طريقة لإرفاق مستمع عالمي بجميع AJAX المكالمات؟](https://stackoverflow.com/questions/11687648/using-jsf-2-0-facelets-is-there-a-way-to-attach-a-global-listener-to-all-ajax- المكالمات)
  • [FullAjaxExceptionHandler لا يعرض صفحة خطأ انتهاء صلاحية الجلسة على اياكس زر](https://stackoverflow.com/questions/25366069/fullajaxexceptionhandler-does-not-show-session-expired-error-page-on-ajax-button)
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3