"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > जेएसएफ फॉर्म सबमिशन के दौरान प्राधिकरण विफलताओं से कैसे निपटें?

जेएसएफ फॉर्म सबमिशन के दौरान प्राधिकरण विफलताओं से कैसे निपटें?

2024-11-08 को प्रकाशित
ब्राउज़ करें:389

How to Handle Authorization Failures During JSF Form Submissions?

जेएसएफ फॉर्म सबमिशन के दौरान प्राधिकरण विफलताएं: एक व्यापक विश्लेषण

जेएसएफ अनुप्रयोगों में कस्टम प्राधिकरण तंत्र लागू करते समय, पेज नेविगेशन और फॉर्म सबमिशन के बीच अंतर को समझना महत्वपूर्ण है . जबकि रीडायरेक्ट पेज नेविगेशन के लिए निर्बाध रूप से काम करते हैं, वे फॉर्म सबमिशन के दौरान समस्याओं का सामना कर सकते हैं।

समस्या का कारण

इस समस्या का मूल कारण इस तथ्य में निहित है कि जेएसएफ फॉर्म सबमिशन अतुल्यकालिक अनुरोधों को ट्रिगर करता है। जब एक अतुल्यकालिक अनुरोध के जवाब के रूप में रीडायरेक्ट भेजा जाता है, तो JSF AJAX इंजन एक विशिष्ट XML प्रतिक्रिया की अपेक्षा करता है। हालाँकि, एक नियमित HTML पेज भेजना इस अपेक्षा का उल्लंघन करता है, जिसके परिणामस्वरूप उपयोगकर्ता उसी पेज पर बना रहता है। और संभावित मुद्दे। इसके बजाय, अनुशंसित दृष्टिकोण इस उद्देश्य के लिए विशेष रूप से डिज़ाइन किए गए सर्वलेट फ़िल्टर का उपयोग करना है। फ़िल्टर आने वाले अनुरोधों को रोकने का अधिक मजबूत और कुशल साधन प्रदान करते हैं।

एक व्यापक फ़िल्टर कार्यान्वयन

नीचे एक सर्वलेट फ़िल्टर का एक उदाहरण है जो प्राधिकरण जांच को प्रभावी ढंग से संभालता है:

@ वेबफ़िल्टर("/*") सार्वजनिक वर्ग प्राधिकरणफ़िल्टर फ़िल्टर लागू करता है { निजी स्थैतिक अंतिम स्ट्रिंग AJAX_REDIRECT_XML = "" "रीडायरेक्ट>आंशिक-प्रतिक्रिया>"; @ओवरराइड सार्वजनिक शून्य doFilter (ServletRequest req, ServletResponse res, फ़िल्टरचैन श्रृंखला) ServletException, IOException फेंकता है { HttpServletRequest अनुरोध = (HttpServletRequest) अनुरोध; HttpServletResponse प्रतिक्रिया = (HttpServletResponse) res; HttpSession सत्र = request.getSession(गलत); स्ट्रिंग लॉगिनयूआरएल = request.getContextPath() "/login.xhtml"; बूलियन लॉगइन = (सत्र != शून्य) && (सत्र.getAttribute("उपयोगकर्ता") != शून्य); बूलियन लॉगिनRequest = request.getRequestURI().equals(loginURL); बूलियन रिसोर्स रिक्वेस्ट = request.getRequestURI().startsWith(request.getContextPath() रिसोर्सहैंडलर.RESOURCE_IDENTIFIER "/"); बूलियन ajaxRequest = "आंशिक/ajax"।equals(request.getHeader("Faces-Request")); अगर (लॉग इन || लॉगिन अनुरोध || संसाधन अनुरोध) { // अनुरोध जारी रखें. चेन.डूफ़िल्टर(अनुरोध, प्रतिक्रिया); } अन्यथा यदि (ajaxRequest) { // JSF AJAX को रीडायरेक्ट करने का निर्देश देने के लिए विशेष XML प्रतिक्रिया भेजें। प्रतिक्रिया.सेटकंटेंटटाइप("टेक्स्ट/एक्सएमएल"); प्रतिक्रिया.setCharacterEncoding('UTF-8'); प्रतिक्रिया.getWriter().printf(AJAX_REDIRECT_XML, लॉगिनURL); } अन्य { // стандартный синхронный редирект निष्पादित करें। प्रतिक्रिया.sendRedirect(loginURL); } } }

विचार के लिए अतिरिक्त संसाधन

@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);
    }
  }

}

[जेएसएफ 2.0 / फेसलेट्स का उपयोग करना, क्या कोई तरीका है सभी AJAX कॉलों में एक वैश्विक श्रोता संलग्न करने के लिए?](https://stackoverflow.com/questions/11687648/using-jsf-2-0-facelet-is- there-a-way-to-attach-a-global- श्रोता-से-सभी-ajax-कॉल)

[FullAjaxExceptionHandler AJAX बटन पर सत्र समाप्त त्रुटि पृष्ठ नहीं दिखाता है](https://stackoverflow.com/questions/25366069/fullajaxexceptionhandler-does-not-show- सत्र-समाप्त-त्रुटि-पृष्ठ-पर-अजाक्स-बटन)
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3