使用express封装一个简单的http代理服务器以及手动设置Access-Control-Allow-Origin解决跨域问题

2023-11-19

一、跨域是什么?

先来了解一下什么是跨域,才能知道如何解决跨域问题。

跨域:出于浏览器的同源策略限制,使浏览器不能执行其他网站的脚本。同源策略是浏览器对 javascript 施加的安全限制。

所谓同源就是指在同一个域内,就是两个地址具有相同的协议(protocol)、主机(host)和端口号(port)。

例如:

网址1 网址2 是否跨域 原因
http://www.gas.com/img/b.png http://www.gas.com/doc/a.html 协议主机端口号相同
http://www.gas.com https://www.gas.com 协议不同:http:/https:
http://www.gas.com http://www.solid.com 主域名不同:www/vvv
http://www.gas.com http://blog.gas.com 子域名不同:www/blog
http://www.gas.com:3000 http://www.gas.com:4000 端口号不同:3000/4000

注意:跨域限制访问,其实是浏览器的限制。服务器与服务器之间的通信是没有同源策略限制的。所以可以通过在前端使用 http 代理服务器的方式来解决跨域。

放张图理解一下:
在这里插入图片描述

二、创建http代理服务器解决跨域问题

安装 express

npm i express

安装 http-proxy-middleware

npm i http-proxy-middleware

创建 server.js 文件:

const express = require("express");
const path = require('path');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();

// 服务器代理,本地访问 http://localhost:3000/api 时,代理访问到 http://10.39.32.163:30018
app.use('/api', createProxyMiddleware({
	target: "http://10.39.32.163:30018",
	changeOrigin: true,
	pathRewrite: { "^/api": "" }
}))

app.listen(3000, ()=>{
	console.log("server is running at http://localhost:3000")
})

启动上面 server.js 文件:nodemon server.js

然后前端就可以访问本地代理服务器,比如一个 get 请求接口地址为:http://localhost:3000/api/books/history,接口将被转发为 http://10.39.32.163:30018/books/history 来获取数据。

跨域请求都会先发送一个 options 请求,也就是预请求,预请求成功后,才会发送真实的请求。

三、如何设置Access-Control-Allow-Origin跨域

// 设置跨域
app.all("*", (req, res, next) => {
	res.header("Access-Control-Allow-Origin", "*");              	// 允许任意外源访问
	res.header("Access-Control-Allow-Headers", "Content-Type");		// 自定义请求首部字段
	res.header("Access-Control-Allow-Methods", "*");    		 	// 允许所有请求方法
	res.header("Content-Type", "application/json;charset=utf-8");	// 设置数据返回类型为json,字符集为utf8
	if(req.method.toLowerCase() === 'options'){
		res.send(200); // 让 options 尝试快速结束请求
	} else {
    	next();
    }  
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用express封装一个简单的http代理服务器以及手动设置Access-Control-Allow-Origin解决跨域问题 的相关文章

随机推荐

  • VSCode安装教程

    VSCode软件下载 官网下载地址 Visual Studio Code Code Editing Redefined 1 点击Download for Windows的下拉按钮 点击Other downloads 2 在这里可以选择自己想
  • 小孩机器人编程真的有用吗

    小孩机器人编程真的有用吗 很多的家长在培养孩子的学习的时候 是十分的认真耐心的 他们会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于小孩机器人编程真的有用吗并不是很清楚 今天我们就
  • Docker(六)----Swarm搭建Docker集群

    一 什么是Swarm Swarm这个项目名称特别贴切 在Wiki的解释中 Swarm behavior是指动物的群集行为 比如我们常见的蜂群 鱼群 秋天往南飞的雁群都可以称作Swarm behavior Swarm项目正是这样 通过把多个D
  • 数据结构---链表

    目录 链表的概念 封装单项链表 封装链表结构 append方法 追加元素 toString方法 转字符串 insert方法 插入元素 get方法 获取元素 indexof 获取索引 update修改某个位置的元素 removeAt方法 删除
  • SQL 日期比较 datediff

    datediff date1 date2 返回 date1 date2的相差天数 用在select语句 select datediff date select max start time from tb user video log da
  • 史上最强内网渗透知识点总结

    https mp weixin qq com s biz MzI5MDQ2NjExOQ mid 2247487491 idx 1 sn 270336c6cca79b4a4e5d777d41ce71b7 chksm ec1e202bdb69a
  • 银河麒麟操作系统v10安装时间

    银河麒麟操作系统安装时间方法1sudo date r var log installer 方法2df Th 然后sudo dumpe2fs dev nvme0n1p3 grep i created
  • sql的递归查询

    在oracle中通过connect by prior来实现递归查询 分类 Oracle随笔 2007 02 16 09 13 11278人阅读 评论 3 收藏 举报 connect by 是结构化查询中用到的 其基本语法是 select f
  • vue3 组件传值之 props 与 attrs 的区别

    最近在学习 vue3 整理了一些学习笔记 如果有人看到 并发现我有写的不对的地方 欢迎指正 用过 vue 组件传值的小伙伴都知道 props 这个属性 而 attrs 属性可以看做 props 的加强版 用来简化 vue 组件传值 那么这两
  • 条件变量(condition variable)详解

    原理 假设我们需要解决这样一个问题 一个列表记录需要处理的任务 一个线程往此列表添加任务 一个线程processTask处理此列表中的任务 这个问题的一个关键点在于processTask怎么判断任务列表不为空 一般有两种方法 一 proce
  • Mathematica的Combinatorica`程序包来研究分拆

    文章目录 引论 步骤 0x00 导入程序包 0x01 Partitions 0x02 Compositions Log 引论 分拆可以看我的这篇文章 在线的Combinatorica 程序包文档可以看这个 在线的Combinatorica
  • 我所理解的RSA加密算法

    RSA简介 非对称加密算法 有一对公私钥组成 1977年由三位数学家Rivest Shamir 和 Adleman 设计了一种算法 没错RSA是三个人名字的首字母 密钥越长越难破解 1024位目前无法破解 因此1024位的RSA密钥基本安全
  • 实现instanceof操作符

    实现instanceof操作符 const theInstanceof function object constructor if typeof object object typeof constructor function retu
  • Spark学习(文件读取路径)

    在不同的启动模式下 加载文件时的路径写法是不一样的 对于local模式下 默认就是读取本地文件 而在standlone或者yarn client 或者cluster模式下 默认读的都是hdfs文件系统 这几种模式下很难读取本地文件 这是很显
  • Qt 信号和槽的小问题(新手向)

    Qt项目报错 static assertion failed Signal and slot arguments are not compatible 信号和槽的参数不对应 例 槽函数 void A give QString a qDebu
  • 内存数据库-3-[redis]的架构原理和部署模式

    参考redis三种模式对比 Redis 是一个开源的 key value 存储系统 由于出众的性能 大部分互联网企业都用来做服务器端缓存 1 单实例模式 问题 1 内存容量有限 2 处理能力有限 3 无法高可用 Redis 在3 0版本前只
  • 我的股票项目环境配置过程记录(含python打包方法linux windows)

    股票项目从源码配置环境 V1 0 Windows 如果只是跑只需要这两个 pip3 install PyQt5 i https pypi douban com simple pip install U matplotlib pip inst
  • 直流-直流(DC-DC)变换电路

    直流 直流 DC DC 变换电路 可以将一种直流电源经过变换电路后输出另一种具有不同输出特性的直流电源 可以是一种固定电压或可调电压的直流电 按照电路拓扑结构的不同 DC DC变换电路可以分成两种形式 不带隔离变压器的DC DC变换电路和带
  • Tomcat7安装及配置教程

    Apache Tomcat7 0安装及配置教程 Apache Tomcat7 0官方网站链接 http tomcat apache org apache tomcat 7 0 73 windows x64 先解压下载的压缩包 然后在bin目
  • 使用express封装一个简单的http代理服务器以及手动设置Access-Control-Allow-Origin解决跨域问题

    一 跨域是什么 先来了解一下什么是跨域 才能知道如何解决跨域问题 跨域 出于浏览器的同源策略限制 使浏览器不能执行其他网站的脚本 同源策略是浏览器对 javascript 施加的安全限制 所谓同源就是指在同一个域内 就是两个地址具有相同的协