Heim >Web-Frontend >js-Tutorial >So lösen Sie das domänenübergreifende Ajax-Problem
Lösung für das domänenübergreifende Ajax-Problem: 1. Fügen Sie einen Header zum Antwortheader hinzu, um den Zugriff zu ermöglichen. 2. JSONP unterstützt nur Get-Anfragen, aber keine Post-Anfragen. 4. Verwenden Sie Nginx, um eine Unternehmensebene zu erstellen Schnittstellen-Gateway.
Verwandte kostenlose Lernempfehlungen: ajax (Video)
ajax-übergreifende Problemlösung:
Lösung 1: Hinzufügen Header zum Antwortheader Zugriff zulassen
Cross-Origin Resource Sharing (CORS) Cross-Origin Resource Sharing
Die Sicherheitsgrundlage dieser domänenübergreifenden Zugriffslösung basiert auf „JavaScript kann diesen HTTP-Header nicht steuern“
Es erfordert eine Autorisierung über den von zurückgegebenen HTTP-Header die Zieldomäne. Gibt an, ob domänenübergreifender Zugriff zugelassen werden soll.
response.addHeader(‘Access-Control-Allow-Origin:*’);//允许所有来源访问 response.addHeader(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式
Lösung 2: JSONP unterstützt nur Get-Anfragen und keine Post-Anfragen
Verwendung: ①Datentyp in JSONP ändern ②JSONP: „jsonpCallback“————Der tatsächliche an das Backend gesendete Wert ist http:// a.a.com/ a/FromServlet?userName=644064&jsonpCallback=jQueryxxx ③Das Backend erhält den jsonpCallback in der Get-Anfrage ④Konstruieren Sie die Rückrufstruktur
$.ajax({ type : "GET", async : false, url : "http://a.a.com/a/FromServlet?userName=644064", dataType : "jsonp",//数据类型为jsonp jsonp : "jsonpCallback",//服务端用于接收callback调用的function名的参数 success : function(data) { alert(data["userName"]); }, error : function() { alert('fail'); } }); //后端 String jsonpCallback = request.getParameter("jsonpCallback"); //构造回调函数格式jsonpCallback(数据) resp.getWriter().println(jsonpCallback+"("+jsonObject.toJSONString()+")");
JSONP-Implementierungsprinzip
Unter derselben Ursprungsrichtlinie kann die Seite unter einem bestimmten Server die nicht erhalten Daten außerhalb des Servers, das heißt, allgemeines Ajax kann keine domänenübergreifenden Anforderungen stellen. Ausnahmen sind jedoch Tags wie img, iframe und script, die über das src-Attribut Daten auf anderen Servern anfordern können. Mithilfe der offenen Richtlinie des 3f1c4e4b6b16bbbd69b2ee476dc4f83a-Tags können wir Daten domänenübergreifend anfordern. Dies erfordert natürlich die Mitarbeit des Servers. Der Kern von Ajax in Jquery besteht darin, nicht zu dieser Seite gehörende Inhalte über XmlHttpRequest abzurufen, während der Kern von JSONP darin besteht, das 3f1c4e4b6b16bbbd69b2ee476dc4f83a-Tag dynamisch hinzuzufügen, um das vom Server bereitgestellte js-Skript aufzurufen.
Wenn wir normalerweise JSON-Daten anfordern, gibt der Server eine Zeichenfolge mit Daten vom Typ JSON zurück, und wenn wir den JSONP-Modus zum Anfordern von Daten verwenden, gibt der Server einen ausführbaren JavaScript-Code zurück. Da das domänenübergreifende Prinzip von JSONP darin besteht, den Quellcode von 3f1c4e4b6b16bbbd69b2ee476dc4f83a dynamisch zu laden, können wir die Parameter nur über die URL übergeben, sodass der Typ von JSONP nur abgerufen werden kann!
Beispiel:
$.ajax({ url: 'http://192.168.10.46/demo/test.jsp', //不同的域 type: 'GET', // jsonp模式只有GET 是合法的 data: { 'action': 'aaron' }, dataType: 'jsonp', // 数据类型 jsonp: 'jsonpCallback', // 指定回调函数名,与服务器端接收的一致,并回传回来 })
Tatsächlich wird jquery intern konvertiert in
http://192.168.10.46/demo/test.jsp?jsonpCallback=jQuery202003573935762227615_1402643146875&action=aaron
Dann dynamisch laden
<script type="text/javascript"src="http://192.168.10.46/demo/test.jsp?jsonpCallback= jQuery202003573935762227615_1402643146875&action=aaron"></script>
und dann wird das Backend Führen Sie jsonpCallback aus (Parameter übergeben) und senden Sie die Daten in Form tatsächlicher Parameter.
Der gesamte Prozess der Verwendung des JSONP-Modus zum Anfordern von Daten: Der Client sendet eine Anfrage und gibt einen ausführbaren Funktionsnamen an (hier führt jQuery den Kapselungsprozess durch, generiert automatisch eine Rückruffunktion für Sie und entnimmt die Daten für die Erfolgsattributmethode). aufrufen, anstatt ein Callback-Handle zu übergeben), akzeptiert der Server den jsonpCallback-Funktionsnamen und sendet dann die Daten in Form von tatsächlichen Parametern
(im JQuery-Quellcode besteht die Implementierung von JSONP darin,