跨域技术


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 可以在客户端与服务器端发送少量的数据,非常适合移动应用。

猜你喜欢

转载自blog.csdn.net/alan_1550587588/article/details/80300192