Heim >Web-Frontend >js-Tutorial >5 Lösungen für JS-Cross-Domain-Requests_Javascript-Kenntnisse

5 Lösungen für JS-Cross-Domain-Requests_Javascript-Kenntnisse

WBOY
WBOYOriginal
2016-05-16 15:52:001177Durchsuche

Die Lösungen für domänenübergreifende Anforderungsdaten umfassen hauptsächlich die folgenden Lösungen:

JSONP方式
表单POST方式
服务器代理
Html5的XDomainRequest
Flash request

Separate Anleitung:

1. JSONP:

Intuitives Verständnis:

Es geht darum, eine Funktion dynamisch auf dem Client zu registrieren

funktion a(data) und übergeben Sie dann den Funktionsnamen an den Server. Der Server gibt ein a({/*json*/}) zur Ausführung an den Client zurück und ruft so das

des Clients auf

Funktion a(Daten) und damit domänenübergreifend.

Geburtshintergrund:

1. Ajax fordert direkt normale Dateien an, was das Problem des domänenübergreifenden Zugriffs ohne Erlaubnis mit sich bringt, unabhängig davon, ob es sich um eine statische Seite, eine dynamische Webseite, einen Webdienst oder ein WCF handelt. Domain-Anfrage, es wird nicht funktionieren.

2. Beim Aufrufen von js-Dateien auf der Webseite ist dies jedoch nicht betroffen

3. Wir haben festgestellt, dass alle Tags mit Src-Attributen domänenübergreifende Funktionen haben, wie zum Beispiel: 3f1c4e4b6b16bbbd69b2ee476dc4f83aa1f02c36ba31691bcfe87b2722de723bd5ba1642137c3f32f4f4493ae923989c

4. Wenn Sie derzeit domänenübergreifend über die reine Webseite auf Daten zugreifen möchten (ActiveX-Steuerelemente, serverseitige Proxys, zum zukünftigen HTML5 gehörende Websockets usw. sind nicht enthalten), können Sie nur die verwenden Folgende Methode: Versuchen Sie auf dem Remote-Server, die Daten in Text im JS-Format zu laden, damit sie vom Client aufgerufen und weiterverarbeitet werden können.

5. JSON ist ein reines Zeichendatenformat und kann von js nativ unterstützt werden.

6. Hier ist die Lösung: Der Webclient ruft die dynamisch generierte js-Formatdatei (normalerweise mit json als Suffix) auf dem domänenübergreifenden Server auf genau die gleiche Weise auf, wie er das Skript aufruft.

7. Nachdem der Client die JSON-Datei erfolgreich aufgerufen hat, erhält er die erforderlichen Daten und verarbeitet sie anschließend gemäß seinen eigenen Anforderungen.

8 Um dem Kunden die Nutzung von Daten zu erleichtern, hat sich nach und nach ein informelles Übertragungsprotokoll namens JSONP gebildet. Ein wichtiger Punkt dieses Protokolls besteht darin, Benutzern die Übergabe eines Rückrufparameters an den Server zu ermöglichen. Wenn der Server dann Daten zurückgibt, verwendet er diesen Rückrufparameter als Funktionsnamen zum Umschließen der JSON-Daten, sodass der Client ihn anpassen kann eigene Funktion zur Verarbeitung der zurückgegebenen Daten.

Detaillierte Umsetzung:

Ob jQuery, extjs oder andere Frameworks, die JSONP unterstützen, die Arbeit, die sie hinter den Kulissen leisten, ist die gleiche. Lassen Sie mich die Implementierung von JSONP auf dem Client Schritt für Schritt erklären:

1. Wir wissen, dass die Webseite bedingungslos ausgeführt werden kann, selbst wenn der Code in der domänenübergreifenden JS-Datei (die natürlich der Sicherheitsrichtlinie für Webskripte entspricht) vorhanden ist.

Im Stammverzeichnis des Remote-Servers remoteserver.com befindet sich ein remote.js-Dateicode wie folgt:

alert('Ich bin eine Remote-Datei');

Der lokale Server localserver.com hat einen jsonp.html-Seitencode wie folgt:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
</head>
<body>

</body>
</html>

Es besteht kein Zweifel, dass auf der Seite ein Eingabeaufforderungsfenster angezeigt wird, das anzeigt, dass der domänenübergreifende Aufruf erfolgreich war.

2. Jetzt definieren wir eine Funktion auf der Seite jsonp.html und rufen sie dann auf, indem wir Daten in remote.js übergeben.

jsonp.html-Seitencode lautet wie folgt:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <script type="text/javascript">
  var localHandler = function(data){
    alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);
  };
  </script>
  <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
</head>
<body>

</body>
</html>

Der Dateicode remote.js lautet wie folgt:

localHandler({"result":"Ich bin die von Remote-JS mitgebrachten Daten"});
Überprüfen Sie die Ergebnisse nach der erfolgreichen Ausführung. Auf der Seite wird ein Eingabeaufforderungsfenster angezeigt, das zeigt, dass die lokale Funktion von den domänenübergreifenden Remote-JS erfolgreich aufgerufen wurde und die von den Remote-JS mitgebrachten Daten ebenfalls empfangen wurden. Ich bin sehr froh, dass der Zweck der domänenübergreifenden Remote-Datenerfassung grundsätzlich erreicht wurde, aber es stellt sich eine andere Frage: Wie teile ich dem Remote-JS den Namen der lokalen Funktion mit, die er aufrufen soll? Schließlich müssen JSONP-Server mit vielen Dienstobjekten konfrontiert werden, und die lokalen Funktionen dieser Dienstobjekte sind unterschiedlich? Schauen wir nach unten.

3. Intelligente Entwickler können sich leicht vorstellen, dass der Aufrufer einen Parameter übergeben kann, um dem Server mitzuteilen, dass der Aufrufer einen Parameter übergeben kann, um dem Server mitzuteilen: „Ich möchte einen JS-Code, der die XXX-Funktion aufruft. Bitte geben Sie ihn zurück.“ für mich“, sodass der Server JS-Skripte generieren und entsprechend den Anforderungen des Clients reagieren kann.

Sehen Sie sich den Code der jsonp.html-Seite an:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <script type="text/javascript">
  // 得到航班信息查询结果后的回调函数
  var flightHandler = function(data){
    alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
  };
  // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
  var url = "http://flightQuery.com/jsonp/flightResult.aspx&#63;code=CA1998&callback=flightHandler";
  // 创建script标签,设置其属性
  var script = document.createElement('script');
  script.setAttribute('src', url);
  // 把script标签加入head,此时调用开始
  document.getElementsByTagName('head')[0].appendChild(script); 
  </script>
</head>
<body>

</body>
</html>

Dieses Mal hat sich der Code stark geändert. Er schreibt nicht mehr direkt die Remote-JS-Datei, sondern den Kernteil der JSONP-Client-Implementierung Der gesamte Prozess des JSONP-Aufrufs.

Wir sehen, dass in der aufrufenden URL ein Codeparameter übergeben wird, der dem Server mitteilt, dass ich die Informationen des Fluges CA1998 überprüfen möchte, und der Rückrufparameter teilt dem Server mit, dass meine lokale Rückruffunktion „flightHandler“ heißt, also bitte Übergeben Sie die Abfrageergebnisse. Rufen Sie diese Funktion auf.

flightHandler({
  "code": "CA1998",
  "price": 1780,
  "tickets": 5
});

我们看到,传递给flightHandler函数的是一个json,它描述了航班的基本信息。运行一下页面,成功弹出提示窗口,jsonp的执行全过程顺利完成!

4、到这里为止的话,相信你已经能够理解jsonp的客户端实现原理了吧?剩下的就是如何把代码封装一下,以便于与用户界面交互,从而实现多次和重复调用。

什么?你用的是jQuery,想知道jQuery如何实现jsonp调用?好吧,那我就好人做到底,再给你一段jQuery使用jsonp的代码(我们依然沿用上面那个航班信息查询的例子,假定返回jsonp结果不变):

OK,服务器很聪明,这个叫做flightResult.aspx的页面生成了一段这样的代码提供给jsonp.html(服务端的实现这里就不演示了,与你选用的语言无关,说到底就是拼接字符串):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" >
 <head>
   <title>Untitled Page</title>
   <script type="text/javascript" src=jquery.min.js"></script>
   <script type="text/javascript">
   jQuery(document).ready(function(){ 
    $.ajax({
       type: "get",
       async: false,
       url: "http://flightQuery.com/jsonp/flightResult.aspx&#63;code=CA1998",
       dataType: "jsonp",
       jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
       jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"&#63;",jQuery会自动为你处理数据
       success: function(json){
         alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。');
       },
       error: function(){
         alert('fail');
       }
     });
   });
   </script>
   </head>
 <body>
 </body>
 </html>

是不是有点奇怪?为什么我这次没有写flightHandler这个函数呢?而且竟然也运行成功了!哈哈,这就是jQuery的功劳了,jquery在处理jsonp类型的ajax时(还是忍不住吐槽,虽然jquery也把jsonp归入了ajax,但其实它们真的不是一回事儿),自动帮你生成回调函数并把数据取出来供success属性方法来调用,是不是很爽呀?

以上所述就是本文的全部内容了,希望大家能够喜欢。

Stellungnahme:
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