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.
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.
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.
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); } } }
Weitere Einblicke in dieses Thema finden Sie in den folgenden Ressourcen:
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