http请求的跨域
跨域
是指 不同域名之间相互访问
URL指向的地址中,二级域名、端口、协议必须与主页面完全相同,否则就算跨域
跨域的问题有以下几个要点
- 在web页面上 , 凡是拥有
src
属性的标签引用其他域当中的资源文件均不受影响 , 比如 iframe , img , script - 表单的提交不存在跨域的影响
- Ajax请求存在跨域请求无权访问的问题
基于上述的要点 , 解决Ajax跨域访问就只有一种可能 , 那就是在远端服务器上设法把数据包装成一段符合JS格式的文本
在前端创建一个<script>标签 , 去获取服务端的这段JS文本
恰巧JSON这种纯文本的数据格式可以简洁地描述各种复杂的数据 , 而且被JS原生支持 , 在客户端进行处理十分方便
于是这样就有了名为jsonp
的解决方案
web客户端通过与调用脚本一模一样的方式 , 来调用跨域服务器上的生成的符合JS格式的文本
它逐渐成为了一种非正式的传输协议 , 该协议允许用户传递一个jsonCallback作为请求的参数 , 服务器端使用这个回调函数的名称来包裹需要回传的数据
所以json和jsonp根本就不是一回事 , 前者是一种数据交换格式 , 后者则是一种跨域数据交互协议
jQuery就提供了这种传输方式的具体实现
用法就是在$.ajax的参数 dataType置为jsonp
可以使用jsonpCallback
设定回调函数
也可以使用success对应的函数 , jquery会自动提取出其中的数据
虽然这种方式归入了ajax当中 , 但本质是一种与ajax完全不同的方式
ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本
当然 , 作为数据传输的载体 , 并不是必须要用json
就算是用个普通的字符串照样没问题 , 但是这样不利于提供公开服务
最后需要说明的就是
限制跨域是浏览器的行为,而不是JS的行为,你也可以自己开发一个浏览器,或者拿开源代码改,使得自己开发的浏览器能够跨域