„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie gehe ich mit Autorisierungsfehlern bei der Übermittlung von JSF-Formularen um?

Wie gehe ich mit Autorisierungsfehlern bei der Übermittlung von JSF-Formularen um?

Veröffentlicht am 08.11.2024
Durchsuche:773

How to Handle Authorization Failures During JSF Form Submissions?

Autorisierungsfehler bei JSF-Formularübermittlungen: Eine umfassende Analyse

Bei der Implementierung benutzerdefinierter Autorisierungsmechanismen in JSF-Anwendungen ist es wichtig, den Unterschied zwischen Seitennavigation und Formularübermittlungen zu verstehen . Während Weiterleitungen für die Seitennavigation reibungslos funktionieren, können bei Formularübermittlungen Probleme auftreten.

Ursache des Problems

Die Hauptursache für dieses Problem liegt in der Tatsache, dass JSF-Formularübermittlungen asynchrone Anforderungen auslösen. Wenn eine Umleitung als Antwort auf eine asynchrone Anfrage gesendet wird, erwartet die JSF-AJAX-Engine eine bestimmte XML-Antwort. Das Senden einer regulären HTML-Seite verstößt jedoch gegen diese Erwartung, was dazu führt, dass der Benutzer auf derselben Seite bleibt.

Das falsche Tool für den Job

Die Verwendung eines benutzerdefinierten Servlets zur Durchführung von Autorisierungsprüfungen führt zu zusätzlicher Komplexität und mögliche Probleme. Stattdessen wird empfohlen, einen speziell für diesen Zweck entwickelten Servlet-Filter zu verwenden. Filter bieten ein robusteres und effizienteres Mittel zum Abfangen eingehender Anfragen.

Eine umfassende Filterimplementierung

Unten finden Sie ein Beispiel für einen Servlet-Filter, der Autorisierungsprüfungen effektiv durchführt:

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

}

Zusätzliche Ressourcen zur Überlegung

Weitere Einblicke in dieses Thema finden Sie in den folgenden Ressourcen:

  • [Gibt es eine Möglichkeit, JSF 2.0 / Facelets zu verwenden? um einen globalen Listener an alle AJAX anzuhängen Anrufe?](https://stackoverflow.com/questions/11687648/using-jsf-2-0-facelets-is-there-a-way-to-attach-a-global-listener-to-all-ajax- Aufrufe)
  • [FullAjaxExceptionHandler zeigt bei Ajax keine Seite mit der Fehlermeldung „Sitzung abgelaufen“ an Schaltfläche](https://stackoverflow.com/questions/25366069/fullajaxExceptionhandler-does-not-show-session-expired-error-page-on-ajax-button)
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3