Maison >Java >javaDidacticiel >Pourquoi la redirection d'autorisation échoue-t-elle lors des soumissions de formulaires JSF lors de l'utilisation d'un FacesServlet personnalisé ?

Pourquoi la redirection d'autorisation échoue-t-elle lors des soumissions de formulaires JSF lors de l'utilisation d'un FacesServlet personnalisé ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-03 01:51:29272parcourir

Why does Authorization Redirect Fail on JSF Form Submissions When Using a Custom FacesServlet?

Redirection d'autorisation lors de l'expiration d'une session dans les soumissions de formulaire JSF

Problème :

Dans un JSF application, un FacesServlet personnalisé a été implémenté pour effectuer des contrôles d'autorisation et rediriger les utilisateurs vers la page de connexion s'ils ne sont pas connectés. Cela fonctionne comme prévu lors de la navigation dans la page, mais lorsqu'un formulaire JSF est soumis, la redirection échoue et l'utilisateur reste sur le même page.

Cause :

Le problème se pose car le lien/bouton de commande JSF déclenche une requête Ajax, qui attend une réponse XML. Cependant, la méthode sendRedirect() envoie une page HTML standard que le moteur Ajax ne peut pas interpréter. De ce fait, la redirection n'est pas effectuée et la page reste inchangée.

Solution :

1. Utilisez un filtre de servlet :

Au lieu d'utiliser un servlet personnalisé, un filtre de servlet doit être utilisé pour les contrôles d'autorisation. Il s'agit de l'approche recommandée car elle est plus adaptée à la tâche.

2. Gérer les requêtes Ajax différemment :

Dans le filtre, gérez les requêtes Ajax séparément. Au lieu d'envoyer une redirection, envoyez une réponse XML spéciale qui demande au moteur JSF Ajax d'effectuer une redirection.

Exemple de filtre :

<code class="java">import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class AuthorizationFilter implements Filter {

    private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
        "<partial-response><redirect url=\"%s\"></redirect></partial-response>";

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        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 ajaxRequest = "partial/ajax".equals(request.getHeader("Faces-Request"));

        if (loggedIn || ajaxRequest) {
            chain.doFilter(request, response);
        } else if (ajaxRequest) {
            response.setContentType("text/xml");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().printf(AJAX_REDIRECT_XML, loginURL);
        } else {
            response.sendRedirect(loginURL);
        }
    }
}</code>

En suivant ces étapes , la fonctionnalité de redirection d'autorisation peut être implémentée correctement pour la navigation dans les pages et les soumissions de formulaires JSF.

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!

Déclaration:
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