Lors de la mise en œuvre de mécanismes d'autorisation personnalisés dans les applications JSF, il est crucial de comprendre la distinction entre la navigation dans les pages et les soumissions de formulaires . Bien que les redirections fonctionnent de manière transparente pour la navigation dans les pages, elles peuvent rencontrer des problèmes lors des soumissions de formulaires.
La cause première de ce problème réside dans le fait que les soumissions de formulaires JSF déclenchent des requêtes asynchrones. Lorsqu'une redirection est envoyée en réponse à une requête asynchrone, le moteur JSF AJAX attend une réponse XML spécifique. Cependant, l'envoi d'une page HTML standard viole cette attente, ce qui fait que l'utilisateur reste sur la même page.
L'utilisation d'un servlet personnalisé pour effectuer des vérifications d'autorisation introduit une complexité supplémentaire et les problèmes potentiels. Au lieu de cela, l'approche recommandée consiste à utiliser un filtre de servlet spécialement conçu à cet effet. Les filtres offrent un moyen plus robuste et plus efficace d'intercepter les demandes entrantes.
Vous trouverez ci-dessous un exemple de filtre de servlet qui gère efficacement les contrôles d'autorisation :
@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); } } }
Pour plus d'informations sur ce sujet, reportez-vous aux ressources suivantes :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!