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é ?
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!