说说如何利用 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 相关文章推荐
由浅到深了解JavaScript类
Sep 08 Javascript
javascript 读取xml,写入xml 实现代码
Jul 10 Javascript
简体中文转换繁体中文(实现代码)
Dec 25 Javascript
js导航栏单击事件背景变换示例代码
Jan 13 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
Jan 14 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
Jan 23 Javascript
jQuery中 bind的用法简单介绍
Feb 13 Javascript
ES6下React组件的写法示例代码
May 04 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
Feb 23 Javascript
详解webpack模块加载器兼打包工具
Sep 11 Javascript
JS数组去重的6种方法完整实例
Dec 08 Javascript
VSCode使用之Vue工程配置eslint
Apr 30 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
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
PHP批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
vue路由--网站导航功能详解
2019/03/29 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
python中私有函数调用方法解密
2016/04/29 Python
Python与Java间Socket通信实例代码
2017/03/06 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
python爬取网易云音乐评论
2018/11/16 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
闭幕式主持词
2014/04/02 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
python的变量和简单数字类型详解
2021/09/15 Python
Python 视频画质增强
2022/04/28 Python
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL