JavaScript中XMLHttpRequest实现跨域访问

摘要:
JavaScript有许多跨域访问方法。本文总结了XMLHttpRequest的跨域访问。我们可以使用XMLHttpRequest访问服务器应用程序。也就是说,JavaScript所在的页面及其访问的服务器应用程序必须属于同一个域。下面的上载文件是一个示例,用于解释XMLHttpRequest的跨域访问。关键问题是服务器的响应是否可以返回到浏览器。上面的文件头表示服务器信任来自http:

JavaScript的跨域访问方法有很多,不下十种。本文总结的是XMLHttpRequest的跨域访问。

在JavaScript中,我们可以用XMLHttpRequest访问服务端应用。但是浏览器对这类访问有一个限制,就是JavaScript所在页面与所访问的服务端应用必须属于同一个域内,也就是同一个IP和端口号内。这就是JavaScript同源策略(Access-Control-Allow-Origin),这样的限制有益于保证服务的安全性,使得本方服务不会被其他网络应用所盗用。

然而这也会给自己带来一些不便,因为即便是同一个网络应用,也有可能在不同的服务器上呀。那么我想,作为网络服务的设计者,如此严格的定义会使得网络开发变得非常丑陋。所以设计者还是留下一个活口,就是在服务器端应用定义时,允许部分网段访问,这就是跨域访问。

下面以上传文件为例子解释XMLHttpRequest的跨域访问。

如何实现跨域访问?

XMLHttpRequest的使用总是大同小异,直接上代码。

 1 var form = new FormData();
 2 form.append("upload", fileObj);
 3 
 4 var http = new XMLHttpRequest();
 5 if (http != null) {
 6     http.onstatechange = stateHandler;
 7     http.open("POST", "host:port/url");
 8     http.send(form);
 9 }
10 
11 stateHandler : function() {
12     if (this.readyState==4) {
13         if (this.status == 200) {
14             console.log("fileObj uploaded successfully!");
15         } else {
16             console.log("Origin null is not allowed by Access-Control-Allow-Origin");
17         }
18     } else {
19         console.log("XMLHttpRequest is not ready");
20     }
21 }

最关键的处理在服务器部分,其实无论是否跨域,服务器都是可以获取上述请求的。问题的关键在于服务器的回应是否能够返回到浏览器。

所以在服务器发送回应的时候,需要添加一个文件头。

response.setHeader("Access-Control-Allow-Origin","http://js.host"); 

这个文件头的第一个参数是允许跨域,第二个参数是接受跨域的服务,上述文件头说明了服务器信任来自http://js.host的请求。

这样也就实现了XMLHttpRequest的跨域访问。

Tricks

在这里,其实与不同的XMLHttpRequest还有一个小小的不同,却很重要。同域内的XMLHttpRequest访问通常只有一次请求,而跨域的XMLHttpRequest有两次。

第一次XMLHttpRequest请求,其method是OPTIONS,并非前文定义的POST。这并不是由JS代码控制的,而是浏览器来完成的操作。其作用是判断该请求是否能够被服务器所响应。

第二次XMLHttpRequest请求才是真正的POST请求,包含了上传的文件内容。

因此在服务器端进行处理的时候,需要判断这两次请求,不要错过了真正的上传内容。

免责声明:文章转载自《JavaScript中XMLHttpRequest实现跨域访问》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c#删除Tool Strip Container控件Dropzone.js实现文件拖拽上传下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于S3C2440的linux-3.6.6移植——LED驱动【转】

本文转载自:http://www.voidcn.com/blog/lqxandroid2012/article/p-625005.html 目前的linux版本的许多驱动都是基于设备模型,LED也不例外。 简单地说,设备模型就是系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动。设备模型会产生一个虚拟的文件系统——sysfs,它给用户提...

Uploadify 3.2 参数属性、事件、方法函数详解

一、属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 。 buttonClass ” 按钮样式 buttonCursor ‘hand’ 鼠标指针悬停在按钮上的样子 buttonImage null 浏览按钮的图片的路径 。...

ElasticSearch大数据分布式弹性搜索引擎使用—从0到1

阅读目录: 背景 安装 查找、下载rpm包 、执行rpm包安装 配置elasticsearch专属账户和组 设置elasticsearch文件所有者 切换到elasticsearch专属账户测试能否成功启动 安装自启动elasticsearch servicewrapper包 下载elasticsearch servicewrapper 包 elasti...

VC6.0 +WDK 开发驱动的环境配置

        前段时间,系统偶感风寒,挂掉了,苦于又没有备份过,只有重装了。原来开发驱动的环境是VC6+DDK+DriverStudio3.2,当时配置的时候就花了好一阵功夫,也没有彻底搞清楚。现在要重装了,决定改用WDK来开发,但环境的配置又搞的我头疼,不太喜欢命令行方式的编译,还是想借助VC6来开发驱动。          在安装完VC6和WDK以...

Java邮件开发电子邮件的基本概念介绍

电子邮件用于网上的信心传递和交流,它是最重要的Internet服务之一。据统计Internet有30%的业务是电子邮件有关的。同时我们也不可否认它在我们的日常生活、工作办公方面扮演着很重要的角色。譬如:许多办公自动化项目(OA)中都要附带发送邮件的功能,如果还要使用OutLook等手工方式就不适合,在这个高速的时代,我们需要提供工作效率,让工作能够自动化。...

js 动态创建a href 循环下载文件只能下载10个或者固定数目的问题

在web前端项目中,很多地方的下载单张图片/文件都可以用<a href="http://t.zoukankan.com/images/logo.png" download="文件名">来下载指定文件 遇到的问题: 在下载多个文件的时候 使用for 循环来触发 a href  download  (此批量下载方法当然不推荐 很lowB 也体验不好...