Ajax 请求是受同源策略限制的,而 HTML 中部分标签(<script><img><iframe>)是不受同源策略限制的。所以可以利用这些标签来请求跨域数据。一般来说开发中大多使用<script>标签来进行跨域请求,因此需要进行跨域时,就使用脚本动态创建一个<script>标签,向外域服务器请求一段脚本,数据写在脚本中,就可以拿到数据。这时候就必须考虑如何处理请求的数据。直接返回var data = xxx当然可以在当前页面中添加一个全局变量,但这么做不能解决两个问题:1.污染全局空间 2.脚本是异步加载的无法进行回调。因此前端和后端会约定一个回调方法名callback,跨域返回的数据会直接作为这个方法的实参传入,即包装为callback(data)的形式,这整个模式就叫做 JSONP。
Ajax 请求是受同源策略限制的,而 HTML 中部分标签(
<script><img><iframe>)是不受同源策略限制的。所以可以利用这些标签来请求跨域数据。一般来说开发中大多使用<script>标签来进行跨域请求,因此需要进行跨域时,就使用脚本动态创建一个<script>标签,向外域服务器请求一段脚本,数据写在脚本中,就可以拿到数据。这时候就必须考虑如何处理请求的数据。直接返回var data = xxx当然可以在当前页面中添加一个全局变量,但这么做不能解决两个问题:1.污染全局空间 2.脚本是异步加载的无法进行回调。因此前端和后端会约定一个回调方法名callback,跨域返回的数据会直接作为这个方法的实参传入,即包装为callback(data)的形式,这整个模式就叫做 JSONP。第一种,转为同域;
第二种,jsonp;
第三种,设置允许跨域
1.iframe 设置
document.domain可以跨子域,支持post2.jsonp方式, 实质是通过url中的query传参,制造一个script标签
3.CORS方式,也就是http头中设置
Access-Control-Allow-Origin,这货是ajax才能用起来的,设了对iframe没啥用4.flash跨域
5.在后端用nginx之类的反向代理,把跨域转换成同域或者同主域
同上,建议看看下面的文章,核心就是动态创建script标签:
Response 中添加
Access-Control-Allow-Origin的 header,它的值就是允许跨域访问服务器的域名,如:如果值是 * ,则是允许所有域名访问,如:
如果要携带Cookie,就添加
Access-Control-Allow-Credentials,将其值设为true还有就是用jsonp实现跨域访问了