Inhaltsverzeichnis
Mozilla大大说
Cross Domain [跨域]
Compatibility [兼容性]
XDomainRequest
Reference [参考资料]
Heim Datenbank MySQL-Tutorial JavaScript跨域(3):HTTP access control (CORS)跨域

JavaScript跨域(3):HTTP access control (CORS)跨域

Jun 07, 2016 pm 03:38 PM
access http javascript 跨域

网上看了很多博客和文档,感觉还是Mozilla大大写的最简单、最好懂,不过文字很长。。 https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS 要整篇翻译,我肯定吃不消,当然也没这个必要,下面就提要说一点吧,这个方法还存在兼容性问题,尽

  网上看了很多博客和文档,感觉还是Mozilla大大写的最简单、最好懂,不过文字很长。。

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

  要整篇翻译,我肯定吃不消,当然也没这个必要,下面就提要说一点吧,这个方法还存在兼容性问题,尽管有相应的解决手段,但是觉得用起来不是特别爽。

Cross-site HTTP requests are HTTP requests for resources from a different domain than the domain of the resource making the request.  For instance, a resource loaded from Domain A (http://domaina.example) such as an HTML web page, makes a request for a resource on Domain B (http://domainb.foo), such as an image, using the img element (http://domainb.foo/image.jpg).  This occurs very commonly on the web today — pages load a number of resources in a cross-site manner, including CSS stylesheets, images and scripts, and other resources.

  跨站点的HTTP请求也就是从一个域名向另一个域名发送请求(POST,GET等),比如,从http://a.com向http://b.com请求一张图片(http://b.com/images.jpg),这种请求或者说这种现象是时有发生的,所以找到一个好方法来处理这类问题也是十分有必要的。

 

Mozilla大大说

  如下,我们在http://foo.example向页面http://bar.example发送请求:

<span>var</span> invocation = <span>new</span><span> XMLHttpRequest(); 
</span><span>var</span> url = 'http://bar.other/resources/public-data/'<span>; 
     
</span><span>function</span><span> callOtherDomain() { 
  </span><span>if</span><span>(invocation) {     
    invocation.open(</span>'GET', url, <span>true</span><span>); 
    invocation.onreadystatechange </span>=<span> handler; 
    invocation.send();  
  } 
}</span>
Nach dem Login kopieren

  可以看看服务器对浏览器的响应

GET /resources/public-data/ HTTP/1.1 
<span>Host: bar.other 
User</span>-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<span> 
Accept</span>-Language: en-us,en;q=0.5<span> 
Accept</span>-<span>Encoding: gzip,deflate 
Accept</span>-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<span> 
Connection: keep</span>-<span>alive 
Referer: http:</span><span>//</span><span>foo.example/examples/access-control/simpleXSInvocation.html </span>
Origin: http:<span>//</span><span>foo.example </span>
<span>  
  
HTTP</span>/1.1 200 OK 
Date: Mon, 01 Dec 2008 00:23:53<span> GMT 
Server: Apache</span>/2.0.61  
<span>Access-Control-Allow-Origin: *</span><span> 
Keep</span>-Alive: timeout=2, max=100<span> 
Connection: Keep</span>-<span>Alive 
Transfer</span>-<span>Encoding: chunked 
Content</span>-Type: application/xml
<span>  
[XML Data]</span>
Nach dem Login kopieren

  这些都是关于HTTP的一些数据和参数,如果不太明白的话,可以看看这本书《HTTP权威指南》

  前半截是FF3.5发送的文件头请求,后半截是服务器的响应。你应该注意到了我标红的那些字,这个就是本文要讲述的重点。

  在请求之前,我们也可以自己设定一些服务器要响应的内容

<span>var</span> invocation = <span>new</span><span> XMLHttpRequest(); 
</span><span>var</span> url = 'http://bar.other/resources/post-here/'<span>; 
</span><span>var</span> body = '<?xml version="1.0"?><person><name>Arun</name></person>'<span>; 
      
</span><span>function</span><span> callOtherDomain(){ 
  </span><span>if</span><span>(invocation) 
    { 
      invocation.open(</span>'POST', url, <span>true</span><span>); 
      <span>invocation.setRequestHeader(</span></span><span>'X-PINGOTHER', 'pingpong'</span><span><span>);</span> 
      <span>invocation.setRequestHeader(</span></span><span>'Content-Type', 'application/xml'</span><span><span>);</span> 
      invocation.onreadystatechange </span>=<span> handler; 
      invocation.send(body);  
    } 
  
......</span>
Nach dem Login kopieren

  setRequestHeader顾名思义就是设置请求头的一些参数。

  上面说了半天也就是告诉大家一些服务器和客户端相关参数设置和解释,还没太涉及到跨域的东西。

 

Cross Domain [跨域]

  这是我放到SAE上的一段代码(http://1.qianduannotes.sinaapp.com/test/ACAO.php)

<span>php
    </span><span>header</span>("Access-Control-Allow-Origin: *"<span>);
    </span><span>//</span><span>header("Access-Control-Allow-Origin: http://yourURL.com");</span>
    <span>echo</span> "hello world"<span>;
</span>?>
Nach dem Login kopieren

  如果我没加header("Access-Control-Allow-Origin: *")这句话,你通过ajax或者其他方式来请求这个数据是会报错的,不信就可以试试这个链接http://1.qianduannotes.sinaapp.com/test/ACAO_none.php

  其中的“*”表示所有域都可以访问,如果将Access-Control-Allow-Origin设置为一个特定的URL,那这个文件就只能被特定URL以及他的子域(http://yoururl.com/sub/)访问。

 

Compatibility [兼容性]

Show all versions IE Firefox Chrome Safari Opera iOS Safari Opera Mini Android Browser Blackberry Browser
                2.1  
                2.2  
            3.2   2.3  
            4.0-4.1   3.0  
  8.0   24.0     4.2-4.3   4.0  
  9.0 19.0 25.0 5.1   5.0-5.1   4.1  
Current 10.0 20.0 26.0 6.0 12.1 6.0 5.0-7.0 4.2 7.0
Near future   21.0 27.0           10.0
Farther future   22.0 28.0            

  最明显的就是IE(8、9)的bug,可以通过XDomainRequest来解决。

<span>//</span><span> 1. Create XDR object </span>
<span>var</span> xdr = <span>new</span><span> XDomainRequest(); 
</span><span>//</span><span> 2. Open connection with server using GET method</span>
xdr.open("get", "http://www.contoso.com/xdr.aspx"<span>);
</span><span>//</span><span> 3. Send string data to server</span>
xdr.send();     
Nach dem Login kopieren

  下面附上一个MSDN上的DEMO

JavaScript跨域(3):HTTP access control (CORS)跨域JavaScript跨域(3):HTTP access control (CORS)跨域XDomainRequest From MSDN

<span><span>html</span><span>></span>
<span><span>script </span><span>type</span><span>="text/javascript"</span><span>></span>
    <span>var</span><span> xdr;
    </span><span>function</span><span> readdata()
    {
        </span><span>var</span><span> dRes </span><span>=</span><span> document.getElementById(</span><span>'</span><span>dResponse</span><span>'</span><span>);
        dRes.innerText </span><span>=</span><span> xdr.responseText;
        alert(</span><span>"</span><span>Content-type: </span><span>"</span> <span>+</span><span> xdr.contentType);
        alert(</span><span>"</span><span>Length: </span><span>"</span> <span>+</span><span> xdr.responseText.length);
    }
    
    </span><span>function</span><span> err()
    {
        alert(</span><span>"</span><span>XDR onerror</span><span>"</span><span>);
    }
    </span><span>function</span><span> timeo()
    {
        alert(</span><span>"</span><span>XDR ontimeout</span><span>"</span><span>);
    }
    </span><span>function</span><span> loadd()
    {
        alert(</span><span>"</span><span>XDR onload</span><span>"</span><span>);
        alert(</span><span>"</span><span>Got: </span><span>"</span> <span>+</span><span> xdr.responseText);
    }
    </span><span>function</span><span> progres()
    {
        alert(</span><span>"</span><span>XDR onprogress</span><span>"</span><span>);
        alert(</span><span>"</span><span>Got: </span><span>"</span> <span>+</span><span> xdr.responseText);
    }
    </span><span>function</span><span> stopdata()
    {
        xdr.abort();
    }
    </span><span>function</span><span> mytest()
    {
        </span><span>var</span><span> url </span><span>=</span><span> document.getElementById(</span><span>'</span><span>tbURL</span><span>'</span><span>);
        </span><span>var</span><span> timeout </span><span>=</span><span> document.getElementById(</span><span>'</span><span>tbTO</span><span>'</span><span>);
        </span><span>if</span><span> (window.XDomainRequest)
        {
            xdr </span><span>=</span> <span>new</span><span> XDomainRequest();
            </span><span>if</span><span> (xdr)
            {
                xdr.onerror </span><span>=</span><span> err;
                xdr.ontimeout </span><span>=</span><span> timeo;
                xdr.onprogress </span><span>=</span><span> progres;
                xdr.onload </span><span>=</span><span> loadd;
                xdr.timeout </span><span>=</span><span> tbTO.value;
                xdr.open(</span><span>"</span><span>get</span><span>"</span><span>, tbURL.value);
                xdr.send();
            }
            </span><span>else</span><span>
            {
                alert(</span><span>'</span><span>Failed to create</span><span>'</span><span>);
            }
        }
        </span><span>else</span><span>
        {
            alert(</span><span>'</span><span>XDR doesn</span><span>'</span><span>t exist</span><span>'</span><span>);
        }
    }


    <h2 id="XDomainRequest">XDomainRequest</h2>
    <input type="text" id="tbURL" value="http://www.contoso.com/xdr.txt"></span></span></span>
Nach dem Login kopieren

 

Reference [参考资料]

  1.Mozilla

  2.MSDN

  3.http://caniuse.com/

  4.屈屈(关闭了页面,链接给忘了,^_^)

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie man Deepseek PDF umwandelt Wie man Deepseek PDF umwandelt Feb 19, 2025 pm 05:24 PM

Deepseek kann Dateien nicht direkt in PDF konvertieren. Abhängig vom Dateityp können Sie verschiedene Methoden verwenden: gemeinsame Dokumente (Word, Excel, PowerPoint): Verwenden Sie Microsoft Office, LibreOffice und andere Software, um als PDF zu exportieren. Bild: Speichern Sie als PDF mithilfe von Image Viewer oder Bildverarbeitungssoftware. Webseiten: Verwenden Sie die Funktion des Browsers "Into PDF" oder die dedizierte Webseite zum PDF -Tool. Ungewöhnliche Formate: Finden Sie den richtigen Konverter und konvertieren Sie ihn in PDF. Es ist wichtig, die richtigen Tools auszuwählen und einen Plan zu entwickeln, der auf der tatsächlichen Situation basiert.

So lesen Sie eine DBF-Datei in Oracle So lesen Sie eine DBF-Datei in Oracle May 10, 2024 am 01:27 AM

Oracle kann DBF-Dateien durch die folgenden Schritte lesen: Erstellen Sie eine externe Tabelle und verweisen Sie auf die DBF-Datei.

Wie implementiert man HTTP-Streaming mit C++? Wie implementiert man HTTP-Streaming mit C++? May 31, 2024 am 11:06 AM

Wie implementiert man HTTP-Streaming in C++? Erstellen Sie einen SSL-Stream-Socket mit Boost.Asio und der asiohttps-Clientbibliothek. Stellen Sie eine Verbindung zum Server her und senden Sie eine HTTP-Anfrage. Empfangen Sie HTTP-Antwortheader und drucken Sie sie aus. Empfängt den HTTP-Antworttext und gibt ihn aus.

Wie implementiert man die Sicherheit beim Hochladen von HTTP-Dateien mit Golang? Wie implementiert man die Sicherheit beim Hochladen von HTTP-Dateien mit Golang? Jun 01, 2024 pm 02:45 PM

Die Implementierung der HTTP-Datei-Upload-Sicherheit in Golang erfordert die folgenden Schritte: Überprüfen Sie den Dateityp. Begrenzen Sie die Dateigröße. Erkennen Sie Viren und Malware. Speichern Sie Dateien sicher.

Wie löste ich das Problem der Schnittstelle zwischen Drittanbietern in der Node.js-Umgebung 403? Wie löste ich das Problem der Schnittstelle zwischen Drittanbietern in der Node.js-Umgebung 403? Mar 31, 2025 pm 11:27 PM

Lösen Sie das Problem der Schnittstelle zwischen Drittanbietern, die 403 in der Node.js-Umgebung zurückgeben. Wenn wir Node.js verwenden, um Schnittstellen von Drittanbietern aufzurufen, begegnen wir manchmal einen Fehler von 403 von der Schnittstelle, die 403 zurückgibt ...

Wie gehe ich mit HTTP-Fehlern in Golang um? Wie gehe ich mit HTTP-Fehlern in Golang um? Jun 03, 2024 am 10:15 AM

Der Umgang mit HTTP-Fehlern in Golang ist von entscheidender Bedeutung, um angemessen auf verschiedene Fehlerbedingungen in Clientanfragen reagieren zu können. Es gibt mehrere Möglichkeiten, mit Fehlern umzugehen: Verwenden Sie integrierte Fehlertypen (z. B. ErrBadRequest), um häufige HTTP-Fehler darzustellen. Erstellen Sie benutzerdefinierte Fehlertypen, um benutzerdefinierte Fehlerbedingungen zu verarbeiten. Verwenden Sie die Funktion httputil.NewError, um basierend auf dem Statuscode und der Meldung einen neuen Fehler zu erstellen.

Laravel Redis -Verbindungsfreigabe: Warum wirkt sich die Auswahlmethode auf andere Verbindungen aus? Laravel Redis -Verbindungsfreigabe: Warum wirkt sich die Auswahlmethode auf andere Verbindungen aus? Apr 01, 2025 am 07:45 AM

Die Auswirkungen des Austauschs von Redis -Verbindungen im Laravel -Framework und der Auswahl von Methoden bei Verwendung von Laravel -Framework und Redis können Entwickler auf ein Problem stoßen: Durch Konfiguration ...

Analysieren Sie den HTTP-Anfragetext in Golang Analysieren Sie den HTTP-Anfragetext in Golang Jun 02, 2024 pm 04:39 PM

Es gibt drei Hauptmethoden, um den HTTP-Anfragetext in Go zu analysieren: Verwenden Sie io.ReadAll, um den gesamten Text zu lesen. Verwenden Sie json.Decoder, um den JSON-Körper zu analysieren. Verwenden Sie r.ParseMultipartForm, um Formulardaten zu analysieren.

See all articles