跨域,是指浏览器不能执行其他网站的脚本。
因为浏览器的同源策略(Same Origin Policy),对 JavaScript 实施了安全限制。非同一域名、协议、端口的请求,是不被浏览器允许的(浏览器会将该请求返回的响应内容拦截,并给出跨域警告)。
跨域的限制行为是仅存在于浏览器的。这也就是为什么会出现通过 API 请求工具调用接口的时候没有问题,但通过浏览起发起请求时就会出现跨域警告。
表现:
<script src="...">
嵌入跨域脚本<img>
标签嵌入图片<video>
、<audio>
标签嵌入媒体资源<iframe>
标签嵌入跨域资源<link rel="stylesheet" href="..." >
标签嵌入CSSJSOP 就是根据 script 标签可以嵌入跨域脚本这一特性,在 script 标签里填入跨域资源 url,比较关键的一点是 url 末尾会带一个callback(回调函数),用于接收返回的跨域资源。具体一点就是客户端 callback 传给服务端,普通响应返回的都是 JSON 字符串,但如果是 JSONP 的话,服务端返回响应时会返回一串可执行的javascript 字符串。通常是返回 执行约定好的 callback 的代码字符串,并且将响应数据作为参数传入,e.x. res.send('callback(' + data + ')')
),这样客户端拿到响应时执行返回的 js 字符串(应该是用的 eval),就能得到跨域的响应数据。(JSONP 只是前后端约定好的一种 JSON 使用方式,且仅支持 GET 请求。)