说说如何利用 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+XMLHttpRequest+asp.net无刷新读取数据库数据
Aug 09 Javascript
jquery中的$(document).ready()与window.onload的区别
Nov 18 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
Dec 01 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
Mar 01 Javascript
js拦截alert对话框另类应用
Jan 16 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
Mar 18 Javascript
jQuery获得子元素个数的方法
Apr 14 Javascript
贴近用户体验的Jquery日期、时间选择插件
Aug 19 Javascript
深入浅析Vue中的slots/scoped slots
Apr 03 Javascript
10分钟上手vue-cli 3.0 入门介绍
Apr 04 Javascript
Vue中的v-for循环key属性注意事项小结
Aug 12 Javascript
原生js实现放大镜组件
Jan 22 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定期拉取数据对比方法实例
2019/09/22 PHP
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
实现js保留小数点后N位的代码
2014/11/13 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
vue组件的写法汇总
2018/04/12 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python查找第k小元素代码分享
2013/12/18 Python
Python写的贪吃蛇游戏例子
2014/06/16 Python
python optparse模块使用实例
2015/04/09 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
matplotlib中legend位置调整解析
2017/12/19 Python
Python的高阶函数用法实例分析
2019/04/11 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
Java如何格式化日期
2012/08/07 面试题
高中的职业生涯规划书
2013/12/28 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
综合实践活动总结
2014/05/05 职场文书
校园环保建议书
2014/05/14 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
保卫工作个人总结
2015/03/03 职场文书
python基础入门之字典和集合
2021/06/13 Python
Elasticsearch 批量操作
2022/04/19 Python