Heim >Web-Frontend >js-Tutorial >Eine Erklärung der Lösung für den Cookie-Verlust beim domänenübergreifenden Ajax-Zugriff
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》
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('data', time(), time()+3600);?>
server.php wird verwendet, um vom Client angefordert zu werden
<?php$name = isset($_POST['name'])? $_POST['name'] : '';$ret = array( 'success' => true, 'name' => $name, 'cookie' => isset($_COOKIE['data'])? $_COOKIE['data'] : '');// 指定允许其他域名访问header('Access-Control-Allow-Origin:http://a.fdipzone.com');// 响应类型header('Access-Control-Allow-Methods:POST'); // 响应头设置header('Access-Control-Allow-Headers:x-requested-with,content-type'); header('content-type:application/json');echo json_encode($ret);?>
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: 'http://b.fdipzone.com/server.php', // 跨域 dataType: 'json', type: 'post', data: {'name':'fdipzone'}, success:function(ret){ if(ret['success']==true){ alert('cookie:' + ret['cookie']); } } }); }) </script> </body></html>
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":""}
Cookie konnte nicht abgerufen werden.
Client
Setzen Sie das Attribut withCredentials auf 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");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: 'http://b.fdipzone.com/server.php', // 跨域 xhrFields:{withCredentials: true}, // 发送凭据 dataType: 'json', type: 'post', data: {'name':'fdipzone'}, success:function(ret){ if(ret['success']==true){ alert('cookie:' + ret['cookie']); } } }); }) </script> </body></html>
server.php Ändern Sie wie folgt:
<?php$name = isset($_POST['name'])? $_POST['name'] : '';$ret = array( 'success' => true, 'name' => $name, 'cookie' => isset($_COOKIE['data'])? $_COOKIE['data'] : '');// 指定允许其他域名访问header('Access-Control-Allow-Origin:http://a.fdipzone.com');// 响应类型header('Access-Control-Allow-Methods:POST'); // 响应头设置header('Access-Control-Allow-Headers:x-requested-with,content-type');// 是否允许请求带有验证信息header('Access-Control-Allow-Credentials:true'); header('content-type:application/json');echo json_encode($ret);?>Folgen Sie den vorherigen Schritten und die Anfrage gibt
{"success":true,"name":"fdipzone","cookie":"1484558863"}zurück um das Cookie erfolgreich zu erhalten
XMLHttpRequest cannot load http://b.fdipzone.com/server.php. Credentials flag is 'true', but the 'Access-Control-Allow-Credentials' header is ''. It must be 'true' to allow credentials. Origin 'http://a.fdipzone.com' is therefore not allowed access.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 '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://a.fdipzone.com' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.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!