Question

J'ai une application dans laquelle la plupart des demandes sont soumises via AJAX, bien que certaines soient soumises via "normale". Requêtes HTTP. Si une demande est soumise et que la session de l'utilisateur a expiré, le code JSON suivant est renvoyé:

{"authentication":"required"}

La fonction JavaScript qui soumet toutes les demandes AJAX gère cette réponse en affichant un message contextuel et en redirigeant l'utilisateur vers la page de connexion.

Cependant, quand une requête non-AJAX reçoit cette réponse, le JSON est simplement affiché dans le navigateur, car la réponse est traitée directement par le navigateur (c'est-à-dire que la fonction JavaScript susmentionnée est ignorée). Évidemment, ce n'est pas idéal et j'aimerais que les requêtes non AJAX recevant cette réponse se comportent de la même manière que les requêtes AJAX. Pour y parvenir, je peux penser à 2 options:

  1. Parcourez l'application et convertissez toutes les requêtes en requêtes AJAX. Cela fonctionnerait, mais pourrait aussi prendre beaucoup de temps!

  2. Le JSON présenté ci-dessus est généré par un JSP très simple. Je me demande s'il serait possible d'ajouter un gestionnaire d'événements JavaScript à ce fichier JSP qui est exécuté juste avant que le contenu ne soit affiché dans le navigateur. Je suppose que cela ne serait jamais appelé pour des demandes AJAX? Ce gestionnaire peut appeler l'autre code JavaScript qui affiche la fenêtre contextuelle et effectue la redirection.

Si quelqu'un sait exactement comment je peux implémenter le gestionnaire que j'ai décrit dans (2), ou s'il a d'autres solutions potentielles, je lui serais très reconnaissant de le transmettre.

Salut, Don

Était-ce utile?

La solution

Vous ne pouvez pas ajouter un gestionnaire au JSP de cette façon. Tout ce que vous ajouterez en fera une page non-productrice de JSON.

Il y a deux options que je peux voir: Ajoutez un paramètre à la page en ajoutant un paramètre URL à l’écran qui modifie la sortie.

URL: http: //domain/page.jsp? ajaxRequest = true générerait json uniquement

URL: http: //domain/page.jsp afficherait une page jsp pouvant être transférée vers une autre page.

OU

changez la réponse pour que le code de renvoi dans le JSP soit exécuté par le navigateur Web s'il est touché directement. Ensuite, appelez AJAX pour éliminer le code de renvoi, puis traitez ce qui reste.

Autres conseils

3) Modifiez votre code AJAX pour ajouter une variable à GET ou POST: outputJson = 1

4) Consultez l’en-tête HTTP de la requête "Accepter".

Ensuite, côté serveur, personnalisez la sortie:

par exemple

if(Accept contains application/json...) { // client asking for json, likely  to be XHR
  return {"foo":"bar"}
} else { // other
  return "Location: /login-please";
}

Commencez avec un message d'erreur plus intelligent, comme ceci:

{"error":"authentication required"}

Emballez la sortie JSON dans un rappel:

errorHandler({"error":"authentication required"});

Demandez à un gestionnaire d’attendre dans votre script:

function errorHandler(r) {
   alert(r.error);
}

Et n'oubliez pas de l'envoyer sous la forme text / javascript et non application / x-json .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top