AJAX(XMLHttpRequest)进行跨域请求方法详解

上传人:平*** 文档编号:9460663 上传时间:2017-10-03 格式:DOCX 页数:12 大小:44.14KB
返回 下载 相关 举报
AJAX(XMLHttpRequest)进行跨域请求方法详解_第1页
第1页 / 共12页
AJAX(XMLHttpRequest)进行跨域请求方法详解_第2页
第2页 / 共12页
AJAX(XMLHttpRequest)进行跨域请求方法详解_第3页
第3页 / 共12页
AJAX(XMLHttpRequest)进行跨域请求方法详解_第4页
第4页 / 共12页
AJAX(XMLHttpRequest)进行跨域请求方法详解_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《AJAX(XMLHttpRequest)进行跨域请求方法详解》由会员分享,可在线阅读,更多相关《AJAX(XMLHttpRequest)进行跨域请求方法详解(12页珍藏版)》请在金锄头文库上搜索。

1、注意:以下代码请在 Firefox 3.5、Chrome 3.0、Safari 4 之后的版本中进行测试。IE8 的实现方法与其他浏览不同。 跨域请求,顾名思义,就是一个站点中的资源去访问另外一个不同域名站点上的资源。这种情况很常见,比如说通过 style 标签加载外部样式表文件、通过 img 标签加载外部图片、通过 script 标签加载外部脚本文件、通过 Webfont 加载字体文件等等。默认情况下,脚本访问文档属性等数据采用的是同源策略(Same origin policy)。那么,什么是同源策略呢?如果两个页面的协议、域名和端口是完全相同的,那么它们就是同源的。同源策略是为了防止从一个

2、地址加载的文档或脚本访问或者设置从另外一个地址加载的文档的属性。如果两个页面的主域名相同,则还可以通过设置 document.domain 属性将它们认为是同源的。随着 Web2.0 和 SNS 的兴起, Web 应用对跨域访问的需求也越来越多,但是,在脚本中进行跨域请求是受安全性限制的,Web 开发人员迫切需要提供一种更安全、方便的跨域请求方式来融合(Mashup )自己的 Web 应用。这样做的一个好处就是可以将请求分摊到不同的服务器,减轻单个服务器压力以提高响应速度;另外一个好处是可以将不同的业务逻辑分布到不同的服务器上以降低负载。值得庆幸的是,跨域请求的标准已经出台,主流浏览器也已经实

3、现了这一标准。W3C 工作组中的 Web Applications Working Group(Web 应用工作组)发布了一个 Cross-Origin Resource Sharing(跨域资源共享,该规范地址:http:/www.w3.org/TR/access-control/和 http:/dev.w3.org/2006/waf/access-control/) 推荐规范来解决跨域请求的问题。该规范提供了一种更安全的跨域数据交换方法。具体规范的介绍可以访问上面提供的网站地址。值得注意的是:该规范只能应用在类似 XMLHttprequest 这样的 API 容器内。IE8、 Firefo

4、x 3.5 及其以后的版本、Chrome 浏览器、Safari 4 等已经实现了 Cross-Origin Resource Sharing 规范,已经可以进行跨域请求了。Cross-Origin Resource Sharing 的工作方式是通过添加 HTTP 头的方法来判断哪些资源允许 Web 浏览器访问该域名下的信息。然而,对于那些 HTTP 请求导致用户数据产生副作用的请求方法(特别是对于除了 GET、某些 MIME 类型的 POST 之外的 HTTP 方法),该规范要求浏览器对请求进行“预先验” ,通过发送 HTTP 的 OPTIONS 请求头询问服务器有哪些支持的方法,在征得服务器

5、的同意后,再使用实际的 HTTP 请求方法发送实际的请求。服务器也可以通知客户端是否需要将验证信息(如 Cookie 和 HTTP Authentication 数据)随同请求一起发送。下面我们就采用实际的例子说明 Cross-Origin Resource Sharing 是如何工作的。1,简单请求 什么样的请求算是简单请求呢?简单请求必须满足下面 2 点:a,只使用 GET、POST 进行的请求,这里的 POST 只包括发送给服务器的数据类型(Content-Type)必须是 application/x-www-form-urlencoded、multipart/form-data 或者

6、text/plain 中一个。b,HTTP 请求没有设置自定义的请求头,如我们常用的 X-JSON。先使用下面的代码进行测试:孟宪会之 AJAX 跨域请求测试 执行状态 readyState: + xhr.readyState; / 然后,在服务器创建 CrossDomainRequest.aspx 的内容如下:点击 “开始测试” 按钮,发送的请求和返回的响应信息如下:1. GET /SimpleCrossSiteRequests.aspx HTTP/1.1 2. Host: dotnet.aspx.cc 3. User-Agent: Mozilla/5.0 (Windows; U; Wind

7、ows NT 5.2; zh-CN; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729) 4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 5. Accept-Language: zh-cn,zh;q=0.5 6. Accept-Encoding: gzip,deflate 7. Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7 8. Keep-Alive: 300 9. Connecti

8、on: keep-alive 10. Referer: http:/www.meng_xian_:801/CrossDomainAjax/SimpleCrossSiteRequests.html 11. Origin: http:/www.meng_xian_:801 12. HTTP/1.x 200 OK 13. Date: Sun, 10 Jan 2010 13:52:00 GMT 14. Server: Microsoft-IIS/6.0 15. X-Powered-By: ASP.NET 16. X-AspNet-Version: 2.0.50727 17. Access-Contro

9、l-Allow-Origin: http:/www.meng_xian_:801 18. Set-Cookie: ASP.NET_SessionId=wk5v5nrs5wbfi4rmpjy2jujb; path=/; HttpOnly 19. Cache-Control: private 20. Content-Type: text/html; charset=utf-8 21. Content-Length: 84 需要特别注意的是:在请求信息中,浏览器使用 Origin 这个 HTTP 头来标识该请求来自于 http:/www.meng_xian_:801;在返回的响应信息中,使用 Acc

10、ess-Control-Allow-Origin 头来控制哪些域名的脚本可以访问该资源。如果设置 Access-Control-Allow-Origin:*,则允许所有域名的脚本访问该资源。如果有多个,则只需要使用逗号分隔开即可。注意:在服务器端,Access-Control-Allow-Origin 响应头 http:/www.meng_xian_:801 中的端口信息不能省略。有人可能会想:自己发送请求头会如何呢?比如 xhr.setRequestHeader(Origin,http:/www.meng_xian_:801); 实践证明,自己设置 Origin 头是不行的。是不是现在就可以

11、采用 XMLHttpRequest 来请求任意一个网站的数据呢?还是不行的。允许哪些域名可以访问,还需要服务器来设置 Access-Control-Allow-Origin 头来进行授权,具体的代码是:Response.AddHeader(Access-Control-Allow-Origin, http:/www.meng_xian_:801);这行代码就告诉浏览器,只有来自 http:/www.meng_xian_:801 源下的脚本才可以进行访问。好了,上面我们就完成了一个简单的跨域请求,怎么样?感觉还是不错的吧。下面我们进行一个“预检”请求。2,预检请求 预检请求首先需要向另外一个域名

12、的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。下面的 2 种情况需要进行预检:a,不是上面的简单请求,比如使用 Content-Type 为 application/xml 或 text/xml 的 POST 请求b,在请求中设置自定义头,比如 X-JSON、X-MENGXIANHUI 等注意:在 iis 里进行测试,必须在“应用程序扩展” 里面配置 .aspx 扩展的动作允许 OPTIONS。下面我们举一个预检的请求:1. 3. 4. 5. 孟宪会之 AJAX 跨域请求测试 6. 7. 8. 9. 10. 测试; 17. xhr.open(P

13、OST, url, true); 18. xhr.setRequestHeader(POWERED-BY-MENGXIANHUI, Approve); 19. xhr.setRequestHeader(Content-Type, application/xml); 20. xhr.onreadystatechange = handler; 21. xhr.send(xml); 22. else 23. document.getElementById(content).innerHTML = 不能创建 XMLHttpRequest。; 24. 25. 26. function handler(e

14、vtXHR) 27. if (xhr.readyState = 4) 28. if (xhr.status = 200) 29. var response = xhr.responseText; 30. document.getElementById(content).innerHTML = 结果: + response; 31. else 32. document.getElementById(content).innerHTML = 不能进行跨越访问。 ; 33. 34. 35. else 36. document.getElementById(content).innerHTML +=

15、执行状态 readyState: + xhr.readyState; 37. 38. 39. / 40. 41. 上面的例子我们发送 xml 格式的数据,并且,发送一个非标准的 HTTP 头 POWERED-BY-MENGXIANHUI 来说明服务器端该如何设置响应头的。在服务器端,PreflightedRequests.aspx 的内容如下:1. 2. + Server.HtmlEncode(doc.OuterXml); 28. 29. else 30. 31. Response.Write(不允许你的网站请求。); 32. 33. 34. 35. / 点击“开始测试”按钮,将会执行下面的一

16、系列请求。1. OPTIONS /PreflightedRequests.aspx HTTP/1.1 2. Host: dotnet.aspx.cc 3. User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729) 4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 5. Accept-Language: zh-cn,zh;q=0.

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号