说说如何利用 Node.js 代理解决跨域问题


Posted in Javascript onApril 22, 2019

前后端分离,经常会出现跨域访问被限制的问题。

跨域访问限制是服务端出于安全考虑的限制行为。即只有同域或者指定域的请求,才能访问。这样还可以防止图片被盗链。服务端(比如 Node.js)可以通过代理,来解决这一问题。

1 安装 request 库

npm install request --save-dev

2 配置

我们以知乎日报为例,配置两个代理。一个代理内容,另一个代理图片。

在项目根目录,配置 proxy.js :

//代理
const http = require('http');
const request = require('request');

const hostIp = '127.0.0.1';
const apiPort = 8070;
const imgPort = 8071;

//创建 API 代理服务
const apiServer = http.createServer((req, res) => {
  console.log('[apiServer]req.url='+req.url);
  const url = 'http://news-at.zhihu.com/story' + req.url;
  console.log('[apiServer]url='+url);
  const options = {
    url: url
  };

  function callback(error, response, body) {
    if (!error && response.statusCode === 200) {
      //编码类型
      res.setHeader('Content-Type', 'text/plain;charset=UTF-8');
      //允许跨域
      res.setHeader('Access-Control-Allow-Origin', '*');
      //返回代理内容
      res.end(body);
    }
  }

  request.get(options, callback);
});

//监听 API 端口
apiServer.listen(apiPort, hostIp, () => {
  console.log('代理接口,运行于 http://' + hostIp + ':' + apiPort + '/');
});

//创建图片代理服务
const imgServer = http.createServer((req, res) => {
  const url = 'https://pic2.zhimg.com/' +req.url.split('/img/')[1];
  console.log('[imgServer]url=' + url);
  const options = {
    url: url,
    encoding: null
  };

  function callback(error, response, body) {
    if (!error && response.statusCode === 200) {
      const contentType = response.headers['content-type'];
      res.setHeader('Content-Type', contentType);
      res.setHeader('Access-Control-Allow-Origin', '*');
      res.end(body);
    }
  }

  request.get(options, callback);


});

//监听图片端口
imgServer.listen(imgPort, hostIp, () => {
  console.log('代理图片,运行于 http://' + hostIp + ':' + imgPort + '/')
});

代理的关键点是在响应头添加 Access-Control-Allow-Origin 为 *,表示允许所有域进行访问。

代理前地址 代理后地址
https://pic2.zhimg.com/v2-bb0a0282fd989bddaa245af4de9dcc45.jpg http://127.0.0.1:8071/img/v2-bb0a0282fd989bddaa245af4de9dcc45.jpg
http://news-at.zhihu.com/story/9710345 http://127.0.0.1:8070/9710345

3. 运行

执行:

node proxy.js

 运行结果:

代理接口,运行于 http://127.0.0.1:8070/代理图片,运行于http://127.0.0.1:8071/

打开浏览器,输入代理后的地址,就可以正常访问啦O(∩_∩)O哈哈~

代理内容:

说说如何利用 Node.js 代理解决跨域问题

代理图片:

说说如何利用 Node.js 代理解决跨域问题

以上所述是小编给大家介绍的Node.js代理解决跨域问题详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
一行命令搞定node.js 版本升级
Jul 20 Javascript
JavaScript中的apply和call函数详解
Jul 20 Javascript
JavaScript实现的链表数据结构实例
Apr 02 Javascript
修改jquery中dialog的title属性方法(推荐)
Aug 26 Javascript
Vue学习之路之登录注册实例代码
Jul 06 Javascript
angularJS开发注意事项
May 26 Javascript
vue-router history模式下的微信分享小结
Jul 05 Javascript
javascript实现小型区块链功能
Apr 03 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
Jun 18 jQuery
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
Sep 03 Javascript
关于vue组件事件属性穿透详解
Oct 28 Javascript
vue的三种图片引入方式代码实例
Nov 19 Javascript
详解Vue中使用Axios拦截器
Apr 22 #Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
Apr 22 #Javascript
vue 项目build错误异常的解决方法
Apr 22 #Javascript
js实现web调用摄像头 js截取视频画面
Apr 21 #Javascript
今天,小程序正式支持 SVG
Apr 20 #Javascript
详解Vue中组件的缓存
Apr 20 #Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
Apr 20 #Javascript
You might like
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
2015/03/17 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
PHP与以太坊交互详解
2018/08/24 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
ie8下修改input的type属性报错的解决方法
2014/09/16 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
React 组件间的通信示例
2018/06/14 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
python实现的重启关机程序实例
2014/08/21 Python
python实现决策树分类(2)
2018/08/30 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
python实现银行实战系统
2020/02/26 Python
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
医学生实习自我鉴定
2013/09/27 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
2014年师德承诺书
2014/05/23 职场文书
创建文明城市标语
2014/06/16 职场文书
2014幼儿教师个人工作总结
2014/12/03 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL