web-dev-qa-db-fra.com

Rediriger sur Ajax Jquery Call

Je suis novice pour ajax ici et je sais que quelqu'un aurait déjà rencontré ce problème. J'ai une application héritée construite sur Spring MVC, elle a un intercepteur (filtre) qui redirige l'utilisateur vers la page de connexion chaque fois qu'il n'y a pas de session.

public class SessionCheckerInterceptor extends HandlerInterceptorAdapter {
 public boolean preHandle(HttpServletRequest request,
   HttpServletResponse response, Object handler) throws Exception {
  HttpSession session = request.getSession();

  // check if userInfo exist in session
  User user = (User) session.getAttribute("user");
  if (user == null) {
   response.sendRedirect("login.htm");
   return false;
  }
  return true;
 }
}

Pour les requêtes non xmlhttp, cela fonctionne bien .. mais lorsque j'essaie d'utiliser ajax dans mon application, tout devient bizarre, il n'est pas en mesure de rediriger correctement vers la page de connexion. Comme vérifier la valeur de la

xhr.status = 200 textStatus = parseError errorThrown = "JSON invalide -Markup de ma page de connexion HTML-

$(document).ready(function(){
        jQuery.ajax({
            type: "GET",
            url: "populateData.htm",
            dataType:"json",
            data:"userId=SampleUser",
            success:function(response){
             //code here
            },
         error: function(xhr, textStatus, errorThrown) {
                alert('Error!  Status = ' + xhr.status);
             }

        });
});

J'ai vérifié sur mon firebug qu'il y a une réponse HTTP 302 mais je ne sais pas comment intercepter la réponse et rediriger l'utilisateur vers la page de connexion. Une idée ici? Merci.

22
Mark Estrada

JQuery recherche un résultat de type json , mais comme la redirection est traitée automatiquement, elle recevra le html généré source de votre page login.htm.

Une idée est de faire savoir au navigateur qu'il doit rediriger en ajoutant une variable redirect à l'objet résultant et en le vérifiant dans JQuery:

$(document).ready(function(){ 
    jQuery.ajax({ 
        type: "GET", 
        url: "populateData.htm", 
        dataType:"json", 
        data:"userId=SampleUser", 
        success:function(response){ 
            if (response.redirect) {
                window.location.href = response.redirect;
            }
            else {
                // Process the expected results...
            }
        }, 
     error: function(xhr, textStatus, errorThrown) { 
            alert('Error!  Status = ' + xhr.status); 
         } 

    }); 
}); 

Vous pouvez également ajouter une variable d'en-tête à votre réponse et laisser votre navigateur décider où rediriger. En Java, au lieu de rediriger, faites response.setHeader("REQUIRES_AUTH", "1") et en JQuery vous le faites en cas de succès (!):

//....
        success:function(response){ 
            if (response.getResponseHeader('REQUIRES_AUTH') === '1'){ 
                window.location.href = 'login.htm'; 
            }
            else {
                // Process the expected results...
            }
        }
//....

J'espère que cela pourra aider.

Ma réponse est fortement inspirée par ce fil qui ne devrait laisser aucune question au cas où vous auriez encore des problèmes.

50
thmshd