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 Anfragen 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:
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Autorisierungsfehlern bei der Übermittlung von JSF-Formularen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!