Maison  >  Article  >  interface Web  >  Comment résoudre le problème de l'accès inter-domaines Ajax, la session ne peut pas être enregistrée, etc.

Comment résoudre le problème de l'accès inter-domaines Ajax, la session ne peut pas être enregistrée, etc.

一个新手
一个新手original
2017-09-27 09:59:061855parcourir


Selon les règles de protection du navigateur, le sessionId que nous créons ne sera pas enregistré par le navigateur lors du cross-domain De cette façon, lorsque nous faisons du cross-domain. -domain Lors de l'accès au domaine, notre sessionId ne sera pas enregistré. En d'autres termes, chaque fois qu'une requête est faite, le serveur pensera qu'il s'agit d'une nouvelle personne, pas de la même personne. Afin de résoudre ce problème, la méthode suivante. peut être utilisé pour résoudre cette solution inter-domaines.

Ajouter une configuration dans la requête ajax

    $.ajax({
        url:url,        //加上 xhrFields及crossDomain
        xhrFields: {            //允许带上凭据
            withCredentials: true
        },
        crossDomain: true,        //以上
        success:function(result){
            alert("test");
        },
        error:function(){
        }
    });

À propos de withCredentials

withCredentials :
Par défaut, les requêtes cross-origin ne fournissent pas d'identifiants (cookies, authentification HTTP, certification SSL client, etc.). Vous pouvez spécifier qu'une certaine requête doit envoyer des informations d'identification en définissant la propriété withCredentials sur true. Si le serveur reçoit une demande avec des informations d'identification, il répondra avec les en-têtes HTTP suivants.

"Access-Control-Allow-Credentials : true"

Si une demande avec des informations d'identification est envoyée, mais que la réponse du serveur n'inclut pas l'en-tête ci-dessus, alors le Le navigateur ne transmettra pas la réponse à JavaScript (le réponseText sera donc une chaîne vide, la valeur d'état sera 0 et le gestionnaire d'événements onerror() sera appelé). De plus, le serveur peut également envoyer cet en-tête HTTP dans la réponse Preflight pour indiquer que l'origine est autorisée à envoyer des requêtes avec des informations d'identification.

Les navigateurs qui prennent en charge l'attribut withCredentials incluent Firefox 3.5+, Safari 4+ et Chrome. IE10 et les versions antérieures ne sont pas pris en charge.
En même temps

Remarque

Après avoir ajouté l'en-tête de réponse de base d'autorisation inter-domaines
Vous devez ajouter Access-Allow-Credentials:true
De plus, en raison de la politique de sécurité de Google
Lorsque withCredentials est vrai
Access-Allow-Origin dans ResponseHeader ne peut pas utiliser le caractère générique '*'
Sinon, il affichera une invite

Un caractère générique '*' ne peut pas être utilisé

dans l'en-tête 'Access-Control-Allow-Origin' lorsque l'indicateur d'informations d'identification est vrai. L'origine 'http://url' n'est donc pas autorisée à accéder.

Autre navigation Le serveur est à tester

Selon les règles de protection du navigateur, le sessionId que nous créons ne sera pas enregistré par le navigateur lors du croisement de domaines . De cette façon, lorsque nous effectuons un accès inter-domaines, notre identifiant de session ne sera pas enregistré. En d'autres termes, chaque fois qu'une demande est faite, le serveur pensera qu'il s'agit d'une nouvelle personne, pas de la même personne. pour résoudre ce problème, procédez comme suit. Il existe plusieurs façons de résoudre ce problème inter-domaines.

Ajouter une configuration dans la requête ajax

    $.ajax({
        url:url,        //加上 xhrFields及crossDomain
        xhrFields: {            //允许带上凭据
            withCredentials: true
        },
        crossDomain: true,        //以上
        success:function(result){
            alert("test");
        },
        error:function(){
        }
    });

À propos de withCredentials

withCredentials :
Par défaut, les requêtes cross-origin ne fournissent pas d'identifiants (cookies, authentification HTTP, certification SSL client, etc.). Vous pouvez spécifier qu'une certaine requête doit envoyer des informations d'identification en définissant la propriété withCredentials sur true. Si le serveur reçoit une demande avec des informations d'identification, il répondra avec les en-têtes HTTP suivants.

"Access-Control-Allow-Credentials : true"

Si une demande avec des informations d'identification est envoyée, mais que la réponse du serveur n'inclut pas l'en-tête ci-dessus, alors le Le navigateur ne transmettra pas la réponse à JavaScript (le réponseText sera donc une chaîne vide, la valeur d'état sera 0 et le gestionnaire d'événements onerror() sera appelé). De plus, le serveur peut également envoyer cet en-tête HTTP dans la réponse Preflight pour indiquer que l'origine est autorisée à envoyer des requêtes avec des informations d'identification.

Les navigateurs qui prennent en charge l'attribut withCredentials incluent Firefox 3.5+, Safari 4+ et Chrome. IE10 et les versions antérieures ne sont pas pris en charge.
En même temps

Remarque

Après avoir ajouté l'en-tête de réponse de base d'autorisation inter-domaines
Vous devez ajouter Access-Allow-Credentials:true
De plus, en raison de la politique de sécurité de Google
Lorsque withCredentials est vrai
Access-Allow-Origin dans ResponseHeader ne peut pas utiliser le caractère générique '*'
Sinon, il affichera une invite

Un caractère générique '*' ne peut pas être utilisé dans l'en-tête 'Access -Control-Allow-Origin' lorsque l'indicateur d'informations d'identification est vrai. L'origine 'http://url' n'est donc pas autorisée à accéder.

Autres navigateurs à tester

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