Maison > Java > javaDidacticiel > Comment gérer les échecs d'autorisation lors des soumissions de formulaires JSF ?

Comment gérer les échecs d'autorisation lors des soumissions de formulaires JSF ?

Mary-Kate Olsen
Libérer: 2024-10-30 05:51:02
original
412 Les gens l'ont consulté

How to Handle Authorization Failures During JSF Form Submissions?

Échecs d'autorisation lors des soumissions de formulaires JSF : une analyse complète

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.

Cause du problème

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.

Le mauvais outil pour le travail

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.

Une mise en œuvre complète du filtre

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

}
Copier après la connexion

Ressources supplémentaires à considérer

Pour plus d'informations sur ce sujet, reportez-vous aux ressources suivantes :

  • [En utilisant JSF 2.0 / Facelets, existe-t-il un moyen d'attacher un auditeur global à tous les appels AJAX ?](https://stackoverflow.com/questions/11687648/using-jsf-2-0-facelets-is-there-a-way-to-attach-a-global-listener-to-all -ajax-calls)
  • [FullAjaxExceptionHandler n'affiche pas la page d'erreur de session expirée sur le bouton ajax](https://stackoverflow.com/questions/25366069/fullajaxexceptionhandler-does-not-show-session-expired-error -page-sur-ajax-bouton)

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal