目录
Mozilla大大说
Cross Domain [跨域]
Compatibility [兼容性]
XDomainRequest
Reference [参考资料]
首页 数据库 mysql教程 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>
登录后复制

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

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>
登录后复制

  这些都是关于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>
登录后复制

  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>?>
登录后复制

  如果我没加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();     
登录后复制

  下面附上一个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>
登录后复制

 

Reference [参考资料]

  1.Mozilla

  2.MSDN

  3.http://caniuse.com/

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

deepseek怎么转换pdf deepseek怎么转换pdf Feb 19, 2025 pm 05:24 PM

DeepSeek 无法直接将文件转换为 PDF。根据文件类型,可以使用不同方法:常见文档(Word、Excel、PowerPoint):使用微软 Office、LibreOffice 等软件导出为 PDF。图片:使用图片查看器或图像处理软件保存为 PDF。网页:使用浏览器“打印成 PDF”功能或专用的网页转 PDF 工具。不常见格式:找到合适的转换器,将其转换为 PDF。选择合适的工具并根据实际情况制定方案至关重要。

oracle怎么读取dbf文件 oracle怎么读取dbf文件 May 10, 2024 am 01:27 AM

Oracle 可以通过以下步骤读取 dbf 文件:创建外部表,引用 dbf 文件;查询外部表,检索数据;将数据导入 Oracle 表。

如何使用C++实现HTTP流传输? 如何使用C++实现HTTP流传输? May 31, 2024 am 11:06 AM

如何在C++中实现HTTP流传输?使用Boost.Asio和asiohttps客户端库创建SSL流套接字。连接到服务器并发送HTTP请求。接收HTTP响应头并打印它们。接收HTTP响应正文并打印它。

如何使用 Golang 实现 HTTP 文件上传安全性? 如何使用 Golang 实现 HTTP 文件上传安全性? Jun 01, 2024 pm 02:45 PM

在Golang中实现HTTP文件上传安全性需要遵循以下步骤:验证文件类型。限制文件大小。检测病毒和恶意软件。存储文件安全。

如何在Node.js环境中解决第三方接口返回403的问题? 如何在Node.js环境中解决第三方接口返回403的问题? Mar 31, 2025 pm 11:27 PM

在Node.js环境中解决第三方接口返回403的问题当我们在使用Node.js调用第三方接口时,有时会遇到接口返回403错误�...

如何在 Golang 中处理 HTTP 错误? 如何在 Golang 中处理 HTTP 错误? Jun 03, 2024 am 10:15 AM

在Golang中处理HTTP错误至关重要,以便优雅地响应客户端请求中的各种错误情况。有以下几种方法可以处理错误:使用内置错误类型(例如:ErrBadRequest)表示常见的HTTP错误。创建自定义错误类型来处理自定义错误情况。使用httputil.NewError函数根据状态码和消息创建新的错误。

Laravel Redis连接共享:为何select方法会影响其他连接? Laravel Redis连接共享:为何select方法会影响其他连接? Apr 01, 2025 am 07:45 AM

Laravel框架中Redis连接的共享与select方法的影响在使用Laravel框架和Redis时,开发者可能会遇到一个问题:通过配置...

在 Golang 中解析 HTTP 请求正文 在 Golang 中解析 HTTP 请求正文 Jun 02, 2024 pm 04:39 PM

在Go中解析HTTP请求正文有三种主要方法:使用io.ReadAll读取整个正文。使用json.Decoder解析JSON正文。使用r.ParseMultipartForm解析表单数据。

See all articles