为什么会出现跨域
跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的,html本身没有跨域问题,比如a标签、script标签、甚至form标签(可以直接跨域发送数据并接收数据)等 。
如何解决跨域问题
1. 添加响应头,允许跨域
Header(‘Access-Control-Allow-Origin:*’);//允许所有来源访问
Header(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式
(1).允许单个域名跨域:
header('Access-Control-Allow-Origin:http://www.xxx.com');
(2).允许多个域名跨域:
$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : '';
$allow_origin = array(
'http://www.xxx.com',
'http://www.zzz.com'
);
if(in_array($origin, $allow_origin)){
header('Access-Control-Allow-Origin:'.$origin);
}
(3).允许所有域名访问
header('Access-Control-Allow-Origin:*');
2. JSONP
JSONP是JSON with Padding的略称。它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。关于jsonp的使用方式,可以参考http://blog.csdn.net/alen1985/article/details/6365394,优缺点可以参考http://blog.csdn.net/z69183787/article/details/19191385
注:一旦使用了jsonp,不管你设置的什么请求方式都会变成 GET 方式
简单的例子:
html方面
php方面
3.代理的方式
服务器A的test01.html页面想访问服务器B的后台action,返回“test”字符串,此时就出现跨域请求,浏览器控制台会出现报错提示,由于跨域是浏览器的同源策略造成的,对于服务器后台不存在该问题,可以在服务器A中添加一个代理action,在该action中完成对服务器B中action数据的请求,然后在返回到test01.html页面。
借鉴:
【1】.https://blog.csdn.net/u014727260/article/details/72793459