跨域
同源策略限制了从同一个源加载的文档或脚本如何与另一个源的资源进行交互。这是浏览器的一个用于隔离潜在恶意文件的重要的安全机制。同源指的是:协议、端口号、域名必须一致。
访问同一域名下不同资源不会跨域
CORS
浏览器将 CORS 分为简单请求和非简单请求:
简单请求不会触发 CORS 预检请求。若该请求满足以下两个条件,就可以看作是简单请求:
1)请求方法是以下三种方法之一: ● HEAD ● GET ● POST
2)HTTP 的头信息不超出以下几种字段: ● Accept ● Accept-Language ● Content-Language ● Last-Event-ID ● Content-Type:只限于三个值 application/x-www-form-urlencoded、multipart/form-data、text/plain 若不满足以上条件,就属于非简单请求了。
在简单请求中,在服务器内,至少需要设置字段:Access-Control-Allow-Origin
在非简单请求中,至少需要设置以下字段:
'Access-Control-Allow-Origin'
'Access-Control-Allow-Methods'
'Access-Control-Allow-Headers'
JSONP 跨域
实现原理
1.动态创建一个<script>
标签
2.将请求的数据作为参数拼接在 URL 中,并指定回调函数的名称,然后通过这个<script>
标签来向服务器请求数据
3.服务器收到请求后将数据以参数的形式传递给回调函数,最后将数据作为参数传递回来,由于这个回调函数是在同域下执行的,因此就解决了跨域问题。注意 JSONP 只能用于 GET 请求
具体
要想实现一个 JSONP,可以按照以下的步骤
1.在 HTML 中创建一个回调函数,例如 handleData,并在全局范围定义它。这个函数将在数据请求成功后执行并处理返回后的数据
<script>
function handleData(data)
{
// 处理返回的数据
}
</script>
2.动态创建一个<script>标签,并将数据源的 URL 作为其 src 的属性值,并将回调函数名称以参数的形式传递给服务器,例如
http://example.com/data?callback=handleData`。`
<script>
var script = document.createElement("script");
var url = "http://example.com/data?callback=handleData";
// 数据源的 URL
script.src = url;
document.head.appendChild(script);
</script>