什么是跨域?怎么解决跨域?

Admin
Admin
Admin
52
文章
6
评论
2017年9月12日15:40:27 1 15,139 2119字阅读7分3秒

跨域:指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。例如abc.com下面的js不能调用def.com中的js、对象或数据(因为abc.com和def.com是不同域),所以跨域就出现了。
同源策略:指的是域名相同、协议相同、端口相同,例如我在本地localhost需要请求网络服务器上资源,这时候浏览器就会报错(No 'Access-Control-Allow-Origin' header is present on the requested)。

这个就是同源策略的保护,如果浏览器对JavaScript没有同源策略的保护,那么一些重要的机密网站将会很危险。

http://www.abc.com/index.html 调用 http://www.abc.com/server.php(非跨域)
http://www.abc.com/index.html 调用 http://www.edf.com/server.php(主域名不同:abc/edf,跨域)
http://abc.abc.com/index.html 调用 http://def.abc.com/server.php(子域名不同:abc/def,跨域)
http://www.abc.com:80/index.html 调用 http://www.abc.com:81/server.php(端口不同:80/81,跨域)
http://www.abc.com/index.html 调用 https://www.abc.com/server.php (协议不同:http/https,跨域)

注:localhost和127.0.0.1虽然都指向本机,但也属于跨域的哦。

解决办法:

一、JSONP格式数据

JSONP全称是 JSON with Padding,是为了解决跨域请求资源而产生的解决方案,是一种依靠开发人员创造出的一种非官方跨域数据交互协议。也是比较常见的一种跨域方式,其背后原理就是利用了script标签不受同源策略的限制,在页面中动态插入了script,script标签的src属性就是后端api接口的地址,并且以get的方式将前端回调处理函数名称告诉后端,后端在响应请求时会将回调返还,并且将数据以参数的形式传递回去。
1、基于Script标签实现跨域
前端设置:<script src="http://www.abc.com/server.php?callback=show"></script>

后端设置:

empty($_GET)?$callback='demo':$callback=$_GET['callback'];
$pdo = new PDO("mysql:host=localhost;dbname=h5_10",'root','');
$pdo->query('set names utf8');
$result = $pdo->query("select * from goodsinfo limit 5");
$data = $result->fetchAll(PDO::FETCH_ASSOC);
echo $callback."(".json_encode($data).")";

2、基于jQuery实现跨域
jQuery已经把跨域封装到ajax上了,而且封装得非常的好,使用起来也特别方便,是一般的ajax请求:

注:JSONP只支持GET请求,不支持POST请求。

二、使用反向代理服务器

可以参考博主的另外一篇文章(使用Nginx服务器解决前后端分离开发时的跨域问题),这样做的目的就是相当于前端页面(www.abc.com/index.html)需要调用后端接口(www.edf.com/server.php),可以写一个接口服务(www.abc.com/server.php),由这个服务接口在后端去调用(www.edf.com/server.php)并拿到返回值,然后再返回给index.html,这就是一个代理的模式,相当于绕过了浏览器端,自然就不存在跨域问题。

三、设置服务端的header头文件

1、header("Access-Control-Allow-Origin:http://localhost");
  -- 指定只有http://localhost可以访问
xhr.open('get','http://localhost/8-1.php');  //此时可以请求数据
xhr.open('get','http://127.0.0.1/8-1.php');  //此时不可以请求数据
2、header("Access-Control-Allow-Origin:*"); 
  -- 都可以访问

总结

当然还有其他实现跨域的方式比如在ie8、9下XDR跨域方案,flash方案,以上是一些常用的跨域方案,都各有利弊,比如:jsonp只能发送get请求、服务器跨域需要另起服务器等等,大家可以根据自己项目需求选择适合的解决方案,如果对于跨域还有其他看法或者文中出现错误,欢迎大家留言)。

博主只是一名前端的小白,只是把自己用到的知识分享一下,要是有什么不对的地方,欢迎大家提出~~

继续阅读
Admin
  • 本文由 发表于 2017年9月12日15:40:27
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
Vue 中计算属性和侦听器 前端开发

Vue 中计算属性和侦听器

在 Vue 中通常我们会在模板绑定表达式,模板是用来描述视图结构的。如果模板中的表达式存在过多的逻辑性语句,那么整个模板就会变得特别的臃肿,可读性和维护性将会降低,因此为了简化逻辑,我们可以使用计算属...
浅谈 JS 中的防抖和节流操作 前端开发

浅谈 JS 中的防抖和节流操作

一般在进行窗口的 resize、scroll 等输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用 debounce(防抖)和 thr...
JS中的「import」和「require 」的区别 前端开发

JS中的「import」和「require 」的区别

import 和 require 是 JS 模块化编程使用的,模块化是一种将系统分离成独立功能部分的方法,一个模块是为完成一个功能的一段程序或子程序,"模块"是系统中功能单一且可替换的部分。模块化思想...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:1   其中:访客  0   博主  0
    • 魁梧的大汉 魁梧的大汉 来自天朝的朋友 江苏省苏州市 移动 0

      写的还可以 :grin: