一.什么是跨域?

  跨域问题的出现是因为浏览器的同源策略问题,所谓同源:就是两个页面具有相同的协议(protocol),主机(host)和端口号(port),它是浏览器最核心也是最基本的功能,如果没有同源策略我们的浏览器将会十分的不安全,随时都可能受到攻击。

  当一个浏览器的两个tab页中分别打开百度和谷歌的页面时,当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。 如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以google.com下的js脚本采用ajax读取baidu.com里面的文件数据是会报错的。

  二.解决跨域问题

  1.后台更改header

 1 header('Access-Control-Allow-Origin:*');//允许所有来源访问

2 header('Access-Control-Allow-Method:POST,GET');//允许访问的方式  

  

  2.使用jsonp实现,网页通过script标签向服务器请求json数据,服务器受到请求后,将数据放在一个指定名字的回调函数的参数里面传给前端。

 1 <script src="http://www.test.com/getData?callback=getData"></script>
 2 // 向服务器test.com发出请求,该请求的查询字符串有一个callback参数,用来指定回调函数的名字
 3 
 4 // 处理服务器返回回调函数的数据
 5 <script type="text/javascript">
 6     // 服务器返回的数据会放到回调函数里面
 7     function getData(res){
 8         // 处理获得的数据
 9         console.log(res.data)
10     }
11 </script>

  

  3.使用JQuery提供的jsonp,这里需要注意的是请求方式只能是get,post请求不可以

 1 methods: { 
 2   getData () { 
 3     var self = this 
 4     $.ajax({ 
 5       url: 'http://www.yingaxiang.json', 
 6       type: 'GET', 
 7       dataType: 'JSONP', 
 8       success: function (res) { 
 9         self.data = res.data.slice(0, 3) 
10         self.opencode = res.data[0].opencode.split(',') 
11       } 
12     }) 
13   } 
14 }

  这里vue引入Jquery需要在webpack.base.conf.js文件中配置一下:

 1 plugins: [
 2     new webpack.ProvidePlugin({
 3         $: "jquery",
 4         jQuery: "jquery"
 5     })
 6  ],
 7 
 8 在需要的组件里引入也可以在main.js里全局引入
 9 
10 import $ from 'jquery'

 

  4.在vue开发中实现跨域:在vue项目根目录下找到vue.config.js文件(如果没有该文件则自己创建),在proxy中设置跨域

   当然我们在创建axios的时候需要把baseURL修改为“/api”

1 proxyTable: { 
2   '/api': {  //使用"/api"来代替"https://www.cnblogs.com/yingaxiang" 
3     target: 'https://www.cnblogs.com/yingaxiang/', //源地址 
4     changeOrigin: true, //改变源 
5     pathRewrite: { 
6       '^/api': 'https://www.cnblogs.com/yingaxiang/' //路径重写 
7       } 
8   } 
9 }

  

  不过通过这种方式解决跨域在打包部署的时候会有问题,所以:

1 let serverUrl = '/api/'  //本地调试时 
2 // let serverUrl = 'https://www.cnblogs.com/yingaxiang/'  //打包部署上线时 
3 export default { 
4   dataUrl: serverUrl + '' 
5 }

 

 

  

posted on 2020-10-02 10:52  前端幼儿园_影啊翔  阅读(196)  评论(0编辑  收藏  举报