欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

什么是跨域?跨域有几种实现形式?

程序员文章站 2022-03-30 16:02:50
...
跨域在js中会经常遇见,本篇将会对其进行相关的讲解。

同源策略是个很好的安全机制,但是有时候我们需要从不同的域下获取数据或者进行交互,这个时候同源策略会造成阻碍。
跨域,就是为了实现不同源下数据信息传输和交互。
实现跨域有下面几种方式:
1.JSONP
JSONP是JSON with padding(参数式JSON)的简写,是JSON的一种新应用方式。
JSONP的实现,依靠动态的<script>元素来使用,因为<script>不受同源策略限制,有能力从其他域中加载资源,示例:
通过<script>请求返回一个JSONP

<script src=""http://freegeoip.net/json/?callback=handleResponse></script>

返回的JSONP由两部分组成:回调函数和JSON数据

handleResponse(JSON)

由于通过<script>标签请求的数据会被当做js代码执行,因此回调函数会对JSON数据进行处理,在这个示例里,回调函数就是handleResponse。通常回调函数名会以参数的方式写进请求url中,且在本地定义好回调函数。
缺点:JSONP是从其他域中加载代码执行,如果其他域不安全,则响应中很可能夹带一些恶意代码,此时除了放弃使用JSONP外,没有办法追究,因此要保证数据来源的安全。
2.CORS
CORS(Cross-Origin Resource sharing,跨域资源共享)是Ajax跨域请求的一种方式,定义了在必须访问跨域资源时,浏览器与服务器应该如何进行沟通。
CORS背后的基本思想,就是使用定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是否应该成功。
CORS分为简单请求和复杂请求
同时满足下面两个条件的为简单请求:
1.请求方式为get、post、head三者中的一种;
2.请求头信息不超出这几种字段:Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
简单请求示例:
在我们跨域发送一个简单请求时,会定义一个Origin头部,说明请求来源

Oring:http://www.baidu.com //说明这一个请求是http://www.baidu.com发出的

如果服务器认为这个请求可以接受,就在Access-Control-Allow-Origin头部中返回相同的源信息(假设为公共资源,则可以返回“*”)

Access-Control-Allow-Origin:http://www.baidu.com

如果没有这个头部,或者头部的源信息不匹配,浏览器就会拦截掉返回的响应。
除了简单请求外,都是复杂请求
复杂请求与简单请求类似,只是在发送正式请求之前,会先发送一个预检请求,确认当前域是否在服务器许可范围中,服务器可以接受什么HTTP头信息、请求方式、数据类型等。得到许可回复以后,才会开始正式通信。
下面是预检请求头和响应头

//这是一个预检请求头OPTIONS /cors HTTP/1.1 //注意请求返回为options;Origin: https://api.qiutc.me //请求来源;Access-Control-Request-Method: PUT // 请求的方式Access-Control-Request-Headers: X-Custom-Header //请求头额外信息;Host: api.qiutc.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0...
//这是一个预检响应头HTTP/1.1 200 OKDate: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: https://api.qiutc.meAccess-Control-Allow-Methods: GET, POST, PUT //表明服务器支持的所有跨域方法Access-Control-Allow-Headers: X-Custom-Header //表明服务器支持的额外请求头Content-Type: text/html; charset=utf-8Content-Encoding: gzip
Content-Length: 0Keep-Alive: timeout=2, max=100Connection: Keep-Alive
Content-Type: text/plain

本篇详解了跨域的相关问题,更多相关内容请关注。

相关推荐:

对于函数事件的总结

关于正则表达式的相关理解

Javascript中关于this的用法

以上就是什么是跨域?跨域有几种实现形式?的详细内容,更多请关注其它相关文章!

相关标签: 跨域 实现形式