Heim > Web-Frontend > js-Tutorial > Eine Erklärung der Lösung für den Cookie-Verlust beim domänenübergreifenden Ajax-Zugriff

Eine Erklärung der Lösung für den Cookie-Verlust beim domänenübergreifenden Ajax-Zugriff

jacklove
Freigeben: 2018-06-08 17:58:40
Original
2089 Leute haben es durchsucht

Der domänenübergreifende Ajax-Zugriff kann mithilfe der JSONP-Methode oder durch Festlegen von Access-Control-Allow-Origin erreicht werden, um domänenübergreifenden Zugriff zu erreichen. Weitere Informationen finden Sie in dem Artikel, den ich zuvor geschrieben habe „Ajax-Einstellung Access-Control-Allow-Origin, um domänenübergreifenden Zugriff zu erreichen》

1.Ajax domänenübergreifender Zugriff, Cookie-Verlust

Erstellen Sie zunächst zwei Testdomänen nennt
a.fdipzone .com als Client-Domänennamen
b.fdipzone.com als Server-Domänennamen

Testcode

setcookie.php wird zum Setzen von Server-Cookies verwendet

<?phpsetcookie(&#39;data&#39;, time(), time()+3600);?>
Nach dem Login kopieren

server.php wird verwendet, um vom Client angefordert zu werden

<?php$name = isset($_POST[&#39;name&#39;])? $_POST[&#39;name&#39;] : &#39;&#39;;$ret = array(    &#39;success&#39; => true,    &#39;name&#39; => $name,    &#39;cookie&#39; => isset($_COOKIE[&#39;data&#39;])? $_COOKIE[&#39;data&#39;] : &#39;&#39;);// 指定允许其他域名访问header(&#39;Access-Control-Allow-Origin:http://a.fdipzone.com&#39;);// 响应类型header(&#39;Access-Control-Allow-Methods:POST&#39;);  

// 响应头设置header(&#39;Access-Control-Allow-Headers:x-requested-with,content-type&#39;);

header(&#39;content-type:application/json&#39;);echo json_encode($ret);?>
Nach dem Login kopieren

test.htmlClient-Anforderungsseite

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>
 <head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  <title> ajax 跨域访问cookie丢失的解决方法 </title>
 </head>

 <body>
    <script type="text/javascript">
    $(function(){

        $.ajax({
            url: &#39;http://b.fdipzone.com/server.php&#39;, // 跨域
            dataType: &#39;json&#39;,
            type: &#39;post&#39;,
            data: {&#39;name&#39;:&#39;fdipzone&#39;},
            success:function(ret){
                if(ret[&#39;success&#39;]==true){
                    alert(&#39;cookie:&#39; + ret[&#39;cookie&#39;]);
                }
            }
        });

    })    </script>

 </body></html>
Nach dem Login kopieren

Führen Sie zuerst http://b.fdipzone aus. com/setcookie.php, um ein serverseitiges Cookie zu erstellen.
Dann führen Sie http://a.fdipzone.com/test.html aus

Ausgabe

{"success":true,"name":"fdipzone","cookie":""}
Nach dem Login kopieren

Cookie konnte nicht abgerufen werden.

2. Lösung

Client
Setzen Sie das Attribut withCredentials auf <, wenn Sie 🎜> anfordern true ermöglicht die Angabe, dass Anmeldeinformationen für eine bestimmte Anfrage gesendet werden sollen. Wenn der Server eine Anfrage mit Anmeldeinformationen erhält, antwortet er mit den folgenden HTTP-Headern.

Server Header festlegen

header("Access-Control-Allow-Credentials:true");
Nach dem Login kopieren

Anfragen mit Verifizierungsinformationen zulassen


test.htmlÄndern als folgt:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>
 <head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  <title> ajax 跨域访问cookie丢失的解决方法 </title>
 </head>

 <body>
    <script type="text/javascript">
    $(function(){

        $.ajax({
            url: &#39;http://b.fdipzone.com/server.php&#39;, // 跨域
            xhrFields:{withCredentials: true}, // 发送凭据
            dataType: &#39;json&#39;,
            type: &#39;post&#39;,
            data: {&#39;name&#39;:&#39;fdipzone&#39;},
            success:function(ret){
                if(ret[&#39;success&#39;]==true){
                    alert(&#39;cookie:&#39; + ret[&#39;cookie&#39;]);
                }
            }
        });

    })    </script>

 </body></html>
Nach dem Login kopieren

server.php Ändern Sie wie folgt:

<?php$name = isset($_POST[&#39;name&#39;])? $_POST[&#39;name&#39;] : &#39;&#39;;$ret = array(    &#39;success&#39; => true,    &#39;name&#39; => $name,    &#39;cookie&#39; => isset($_COOKIE[&#39;data&#39;])? $_COOKIE[&#39;data&#39;] : &#39;&#39;);// 指定允许其他域名访问header(&#39;Access-Control-Allow-Origin:http://a.fdipzone.com&#39;);// 响应类型header(&#39;Access-Control-Allow-Methods:POST&#39;);  

// 响应头设置header(&#39;Access-Control-Allow-Headers:x-requested-with,content-type&#39;);// 是否允许请求带有验证信息header(&#39;Access-Control-Allow-Credentials:true&#39;);

header(&#39;content-type:application/json&#39;);echo json_encode($ret);?>
Nach dem Login kopieren

Folgen Sie den vorherigen Schritten und die Anfrage gibt

{"success":true,"name":"fdipzone","cookie":"1484558863"}
Nach dem Login kopieren

zurück um das Cookie erfolgreich zu erhalten


3. Hinweise

1. Wenn der Client das withCredentials-Attribut auf true setzt, der Server jedoch keine Zugriffskontrolle setzt -Allow-Credentials :true, bei der Anfrage wird ein Fehler zurückgegeben.

XMLHttpRequest cannot load http://b.fdipzone.com/server.php. Credentials flag is &#39;true&#39;, but the &#39;Access-Control-Allow-Credentials&#39; header is &#39;&#39;. It must be &#39;true&#39; to allow credentials. Origin &#39;http://a.fdipzone.com&#39; is therefore not allowed access.
Nach dem Login kopieren

2. Nachdem der Server-Header Access-Control-Allow-Credentials: true gesetzt hat, kann Access-Control-Allow-Origin nicht auf * gesetzt werden und muss auf einen Domänennamen gesetzt werden, andernfalls wird ein Fehler ausgegeben zurückgegeben.

XMLHttpRequest cannot load http://b.fdipzone.com/server.php. A wildcard &#39;*&#39; cannot be used in the &#39;Access-Control-Allow-Origin&#39; header when the credentials flag is true. Origin &#39;http://a.fdipzone.com&#39; is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.
Nach dem Login kopieren
In diesem Artikel wird erläutert, wie Sie das Problem des Cookie-Verlusts beim domänenübergreifenden Ajax-Zugriff lösen können. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Erläuterung der Berechnungsmethode von key_len in MySQL

Wie man Curl zur Simulation von IP verwendet und Zugriff auf die Quelle

NULL-Daten über die MySQL-Methode konvertieren

Das obige ist der detaillierte Inhalt vonEine Erklärung der Lösung für den Cookie-Verlust beim domänenübergreifenden Ajax-Zugriff. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage