Différence entre la demande AJAX et une demande de navigateur régulière

Existe-t-il une différence entre une demande AJAX et une demande directe de navigateur (en termes de façon dont une page Web est appelée et chargée)?

En d'autres termes, je veux dire: une requête directe du côté du serveur est-elle traitée de manière différente d'une demande côté client (initiée par le navigateur)?

Une requête AJAX est identique à une requête de navigateur "normale" en ce qui concerne le serveur concerné autre que les en-têtes HTTP légèrement différents. P.ex. chrome envoie:

X-Requested-With:XMLHttpRequest 

Je ne suis pas sûr si cet en-tête est normalisé ou non, ou s'il est différent dans chaque navigateur ou même inclus dans tous les navigateurs.


Edit: Je le récupère, cet en-tête est envoyé par jQuery (et probablement d'autres bibliothèques JS), et non par le navigateur comme en témoignent:

 var xhr = new XMLHttpRequest(); xhr.open('GET', '/'); xhr.send(); 

Qui envoie:

 Accept:*/* Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8 Connection:keep-alive Cookie: .... Host:stackoverflow.com If-Modified-Since:Sat, 31 Dec 2011 01:57:24 GMT Referer:http://stackoverflow.com/questions/8685750/how-does-an-ajax-request-differ-from-a-normal-browser-request/8685758 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11 

Ce qui me conduit à la conclusion que, par défaut, il n'y a absolument aucune différence.

Il peut y avoir des différences d'en-tête, mais la différence de comportement principale est sur le client.

Lorsque le navigateur effectue une demande régulière comme dans window.location.href = "index.html" , il efface la fenêtre actuelle et charge la réponse du serveur dans la fenêtre.

Avec une demande ajax, la fenêtre / document actuel n'est pas affecté et le code javascript peut examiner les résultats de la demande et faire ce qu'il veut avec ces résultats (insérer HTML dynamiquement dans la page, analyser JSON et l'utiliser la logique de la page, analyser XML , etc…).

Le serveur ne fait rien de différent – c'est juste dans la façon dont le client traite la réponse des deux demandes.

Bien que je vous en croie, il y a quelque chose de totalement étrange sur weblogic: j'écris une application à l'aide du framework ExtJS qui fait appel à AJAX.

En effectuant le j_security_check, j'obtiens toujours des erreurs lorsque je le fais de la manière AJAX: Weblogic dit:

 unauthorized: var submitButton = new Ext.Button({ text: 'Logon', formBind: true, //only enabled once the form is valid disabled: true, handler: function() { Ext.Ajax.request({ url: "j_security_check", params: { j_username: dlg.getForm().findField('j_username').getValue(), j_password: dlg.getForm().findField('j_password').getValue() }, method: "GET" }); } }); 

Cela échoue.

Quand je lier ceci:

 window.location.href = "j_security_check?j_username=" + dlg.getForm().findField('j_username').getValue() + "&j_password=" + dlg.getForm().findField('j_password').getValue(); 

Ça marche! Bizarre.

Votre agent utilisateur, également navigateur, envoie un en-tête XHR que vous pouvez saisir de php comme ceci:

 $_SERVER['HTTP_X_REQUESTED_WITH'] 

Pas vraiment. Sauf que la plupart des clients Ajax envoient un en X-Requested-With=XMLHttpRequest tête HTTP X-Requested-With=XMLHttpRequest