解决跨域的几种方案

 这是一个老生常谈的问题了,几乎面试必问吧,譬如问到什么是跨域啊?怎么解决跨域啊?那种方案比较好啊?因为的确是日常开发中不可避免的问题,我自己也经常会遇到,但每次把问题了解决后都没好好的总结,犹如过眼烟云,所以下面我从自己的角度来总结一下这几个问题。

一、什么是跨域

URL的组成:

协议 + 子域名+主域名+端口号+资源地址

当A 页面 URL 的 协议、子域名、主域名、端口号 和 B URL 的 协议、子域名、主域名、端口号有一个不同时再相互请求就会产生跨域问题 ,浏览器的XMLHttpRequest 会自动屏蔽掉不允许发送到服务端。只有当他们都相同时就是同源,浏览器只支持同源策略下相互请求,这是一个很安全的理念,保证了用户信息的安全,防止恶意的网址窃取数据。

二、解决方案

1. cors请求(推荐指数5颗星)

cors需要浏览器和服务器同时支持,目前ie10以下不支持。

使用

客户端不需要什么改造。

服务器:只需要设置2个服务器头。

需要在header 中设置Access-Control-Allow-Origin:*;后面有个*星号,*就是所有域都可以访问

可以支持多种请求方式,不限于get

2.jsonp (推荐指数4颗星)

基本原理就是通过动态创建script标签,然后利用src属性进行跨域。

这么说比较模糊,我们来看个例子:

// 定义一个函数

function f1(fata) {    

console.log(data);

};// 创建一个脚本,并且告诉后端回调函数名叫fun

var body = document.getElementsByTagName('body')[0];

var script = document.gerElement('script');

script.type = 'text/javasctipt';

script.src = 'demo.js?callback=f1'; 

body.appendChild(script);

这部分是jsonp 底层封装实现,如果A页面请求B地址 不同源时,会把B地址转换成script 的src  来解决,避免使用XMLHttpRequest  不同源跨域问题

f1({"name": "name"})

分析一下用了jsonp返回的数据结构,会在json串外面包一层 f1( ),根据callback参数的值会直接执行。所以就执行了事先定义好的fun函数了,并且把数据传入了进来。callback不指定时会随机生成一个方法名。

客户端设置:

服务端设置:

参考文章

https://www.cnblogs.com/starof/p/6434745.html

你可能感兴趣的:(解决跨域的几种方案)