1)跨域源资源共享(CORS,Cross-origin resource sharing)
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
CORS需要浏览器和服务器同时支持。浏览器将CORS请求分成两类:简单请求和非简单请求
- 简单请求
浏览器一旦发现CORS简单请求,就会在头信息中添加一个Origin字段,包含请求页面的源信息(协议+域名+端口),服务器根据该值判断是否同意本次请求。如果服务器认为请求可以接受,就会在Access-Control-Allow-Origin头部返回相同的源信息。如果没有这个头部或者头信息不匹配,浏览器就知道出错了,从而抛出一个错误。
- 非简单请求:比简单请求多了一个预检请求与回应
非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为预检(preflight)请求。该请求使用OPTIONS方法,发送头信息,除了Origin字段,还包含
Access-Control-Request-Method
Access-Control-Request-Headers
服务器接收到预检请求后,检查上述头信息后,判断是否允许跨域请求,如果允许,返回的头部信息包括以下字段,否则不包含CORS相关的头信息字段。
Access-Control-Allow-Origin:
Access-Control-Allow-Methods:
Access-Control-Allow-Headers:
一旦服务器通过了"预检"请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。服务器的回应,也都会有一个Access-Control-Allow-Origin头信息字段。
(2)JSONP (JSON with padding),填充式JSON/参数式JSON
JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调
函数的名字一般是在请求中指定的。而数据就是传入回调函数中的JSON数据。下面是一个典型的JSONP
请求。
http://freegeoip.net/json/?callback=handleResponse
这个 URL 是在请求一个 JSONP 地理定位服务。通过查询字符串来指定 JSONP 服务的回调参数是很
常见的,就像上面的 URL 所示,这里指定的回调函数的名字叫 handleResponse() 。
JSONP 是通过动态 <script> 元素(要了解详细信息,请参考第 13 章)来使用的,使用时可以为
src 属性指定一个跨域 URL。这里的 <script> 元素与 <img> 元素类似,都有能力不受限制地从其他域
加载资源。因为 JSONP 是有效的 JavaScript 代码,所以在请求完成后,即在 JSONP 响应加载到页面中
以后,就会立即执行。
原理:动态添加<script>标签来调用服务器提供的js脚本,为src指定跨域URL,JSONP只支持GET请求。
优点:简单易用,能够直接访问响应文本,支持在浏览器与服务器之间的双向通信。
缺点:JSONP直接从其他域加载代码执行,存在安全性问题;不容易确定JSONP请求是否失败。
(3)Web Sockets
HTTP协议:通信只能由客户端发起,服务器不能主动向客户端推送消息。如果服务器端由连续的状态变化,只能通过轮询的方式。即浏览器每隔一段时间向服务器发送请求。
WebSockets 使用自定义的协议,实现一个双向通信的持久连接。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。Web socket 可以在客户端与服务器端发送少量的数据,非常适合移动应用。