产生原因
为了防止CSRF攻击,浏览器同源策略禁止不同源页面进行DOM操作,禁止使用 XHR 对象向不同源的服务器地址发起 HTTP 请求。
跨域解决方案
现主要跨域解决方案有两种:JSONP跨域和CORS(跨域资源共享)
Ajax本身是不能跨域的,但是配合以上两种方案可以实现跨域。
JSONP方案
script脚本不受同源策略限制,JSONP就是利用script进行跨域请求,服务器把数据包装成JSON返回。
JSONP跨域只支持get请求
JQ+Ajax+JSONP实现跨域
$.ajax({
type:'GET',
dataType:‘jsonp’,
url:‘’,
jsonp:'name' , //指定参数名称
jsonpCallback:'function' , //指定回调函数
success:function (data) {
}
// jsopn如果请求失败不会有任何错误返回
})
CORS方案
跨域资源共享(CORS)是一种机制,它通过HTTP头来告诉浏览器让运行在origin上的web应用被允许访问来自不同服务器上的资源。
新浏览器现在都支持CORS跨域,但是老式IE只能用JSONP。
CORS实现跨域客户端基本不变,服务端在返回数据时添加响应头让浏览器允许其通过
客户端:
$.ajax({
url:'',
type:'POST',
dataType:'jsonp',
crossDomain:'true',
xhrfieds:{withCreadentials'true'} //true表示携带cookie跨域
}),
data:{},
function (data) {
}
CORS请求失败会产生错误,但是为了安全js层面是看不到错误信息的,
只有查看浏览器控制台才能看到。
两者的不同点
- JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求
- 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理
- JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS