轻松解决vuejs跨域
Vuejs跨域问题实战
有时候,本地使用webpack开启一个node的dev端口,项目中使用vuejs去访问别人家的api,比如豆瓣或者其他的api,不使用jsonp肯定就会报跨域的问题。

如何让我们调用别人家的api就像是调用自己家的一样呢?答案就是利用自己的后台去访问这个api,然后转发到自己的前端,但是这么搞,岂不是很麻烦,有没有简单的傻瓜式插件可以替我们做这个操作呢?我们用一下代理的思路proxy来解决这个问题。
其实nodejs有一个httpProxy的组件,正好webpack也支持,那么我们看看如何使用httpProxy,自动的监听vue想要get的某些网站api的请求,自动利用后台去访问api,拿到返回结果,返回给vue。
1.最近使用了http-proxy-middleware! https://www.npmjs.com/package/http-proxy-middleware插件之后,访问别人家的api就像是自己家的一样。
//node的index.js
var proxyMiddleware = require('http-proxy-middleware')
//拦截一切/api的请求,后台代理获取数据,返回到前端
var proxyTable = {
      '/api': {
        target: 'http://xxx.com/v4/',
        changeOrigin: true,
        pathRewrite: {
          '^/api': '/api'
        }
      }
    };
Object.keys(proxyTable).forEach(function (context) {
  var options = proxyTable[context]
  if (typeof options === 'string') {
    options = { target: options }
  }
  app.use(proxyMiddleware(context, options))
})
//vue
export default {
        data() {
            return {
                list:[]
            }
        },
        ready() {
            this.getBanner();
        },
        methods: {
            //请求别人家的api获取列表 /api/xxxx 会被proxy,绕过跨域
            getBanner() {
                const self = this self.$http.get(';/api/xxxx/home';, {
                    _t: new Date().getTime()
                }).then(response = >{
                    let data = response.data
                    //数据对象
                    let json = data.data
                    if (data.status === 0) {
                        self.list = json.list
                    }
                },
                (response) = >{
                    console.log(response)
                })
            }
        },
        components: {
        }
 }
记得提前安装模块:npm install -D http-proxy-middleware
2.或者使用jsonp
参考:https://aotu.io/notes/2016/10/13/vue2/
mounted: function() {
    this.$http.jsonp('https://api.douban.com/v2/movie/top250?count=10', {}, {
        headers: {
        },
        emulateJSON: true
    }).then(function(response) {
        // 这里是处理正确的回调
        this.articles = response.data.subjects
        // this.articles = response.data["subjects"] 也可以
    }, function(response) {
        // 这里是处理错误的回调
        console.log(response)
    });
}
// 不加跨域xhr会发起options请求
Vue.http.options.headers={
	'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'
};
// post的时候会把JSON对象转成formdata
Vue.http.options.emulateJSON=true;
4.nodejs 解除跨域限制:
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
proxyTable参考:http://div.io/topic/1825
https://segmentfault.com/a/1190000007231750
落雨
http://www.cnblogs.com/ae6623/p/6124229.html
http:js-dev.cn
轻松解决vuejs跨域的更多相关文章
- 跨域 - jsonp轻松搞定跨域请求
		
1.jsonp轻松搞定跨域请求 vue中使用axios,遇到跨域我就蒙逼了.第一次真正意义上的尝试使用jsonp js中用 var myscript = document.createElement( ...
 - 解决cookie跨域访问
		
一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入c ...
 - 如何解决ajax跨域问题(转)
		
由 于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决 ajax的跨域问题.本篇将讲述一个小白从遇到跨域不 ...
 - 用nginx的反向代理机制解决前端跨域问题
		
什么是跨域以及产生原因 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制 ...
 - 用iframe设置代理解决ajax跨域请求问题
		
面对ajax跨域请求的问题,想用代理的方式来解决这个跨域问题.在服务器端创建一个静态的代理页面,在客户端用iframe调用这个代理 今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到aja ...
 - CP="CAO PSA OUR" 用P3P header解决iframe跨域访问cookie
		
1.IE浏览器iframe跨域丢失Session问题 在开发中,我们经常会遇到使用Frame来工作,而且有时是为了跟其他网站集成,应用到多域的情况下,而Iframe是不能保存Session的因此,网上 ...
 - 看小白如何解决ajax跨域问题
		
由于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决ajax的跨域问题.本篇将讲述一个小白从遇到跨域不知道 ...
 - 如何解决ajax跨域问题
		
如何解决ajax跨域问题(转) 由 于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决 ajax的跨域问题 ...
 - 解决js跨域问题
		
如何解决js跨域问题 Js跨域问题是web开发人员最常碰到的一个问题之一.所谓js跨域问题,是指在一个域下的页面中通过js访问另一个不同域下 的数据对象,出于安全性考 虑,几乎所有浏览器都不允许这种跨 ...
 
随机推荐
- Bugzilla Error message: couldn't create child process: 720003: index.cgi
			
two steps is try to fix this issue. 1. Turn off the windowns firewall 2. Register the perl to the sy ...
 - [Deepin 15] 安装 Java 8、Git、Firefox、SafeEyes(定时提醒休息工具)
			
一.安装 JDK 8 1.到官网,用 迅雷下载 安装包 (jdk-8u131-linux-x64.tar.gz) 2.解压放到目录 /opt/software/jdk 3.配置环境变量 sudo vi ...
 - SQL Server 2012 Always on Availability Groups安装
			
http://blog.csdn.net/kevinsqlserver/article/details/7886455
 - Mysql5.6主从复制-基于binlog
			
MySQL5.6开始主从复制有两种方式:基于日志(binlog):基于GTID(全局事务标示符). 此文章是基于日志方式的配置步骤 环境: master数据库IP:192.168.247.128sla ...
 - IOS开发常用宏定义
			
//release屏蔽NSLog//放在.pch文件里#ifdef DEBUG #else#define NSLog(...) {};#endif //G.C.D#define BACK(block) ...
 - ArcGIS 在高清屏中主界面界面字体和图标显示过小,如何解决?
			
作者:安日链接:https://www.zhihu.com/question/40658050/answer/132382971来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
 - ExtJS动态设置表头
			
if(document.getElementById("lxdj_radio").checked){ colQd = new Ext.grid.ColumnModel(colMAr ...
 - 【jvm】java查看内存使用jmap,jstat和jstack使用 ,docker启动服务下查看jvm使用情况
			
[声明,如果是docker启动的服务,可以在进入容器内后,再使用如下命令操作] [docker exec -it 容器ID /bin/bash 即可进入容器内] [如果不是docker启动的 ...
 - cocos2d-x retain和release倒底怎么玩?
			
转载请注明,原文地址: http://blog.csdn.net/musicvs/article/details/8689345 正文: 1. 为什么会有retain? C++和Java不一样,Jav ...
 - 黑吃黑第一季/全集Banshee迅雷下载
			
第一季 Banshee Season 1 (2013)看点:“Banshee”在爱尔兰盖尔语中被称为“bean sidhe”,意思是“拥有超能力的女人”.不过在鲍尔的新剧中,Banshee并不是指超自 ...