عند تنفيذ آليات الترخيص المخصصة في تطبيقات 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); } } }
لمزيد من الأفكار حول هذا الموضوع، راجع الموارد التالية:
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3