小满Vue3第四十六章(Proxy跨域)
创始人
2024-02-24 02:17:56
0

1.首先我们先了解一下什么是跨域

主要是出于浏览器的同源策略限制,它是浏览器最核心也最基本的安全功能。

当一个请求url的 协议、域名、端口 三者之间任意一个与当前页面url不同即为跨域。

例如 xxxx.com -> xxxx.com 存在跨域 协议不同

例如 127.x.x.x:8001 -> 127.x.x.x:8002 存在跨域 端口不同

例如 www.xxxx.com -> www.yyyy.com 存在跨域 域名不同

2.如何解决跨域

jsonp 这种方式在之前很常见,他实现的基本原理是利用了HTML里script元素标签没有跨域限制 动态创建script标签,将src作为服务器地址,服务器返回一个callback接受返回的参数

function clickButton() {let obj, sobj = { "table":"products", "limit":10 }; //添加参数s =  document.createElement("script"); //动态创建scripts.src = "接口地址xxxxxxxxxxxx"  + JSON.stringify(obj);document.body.appendChild(s);}
//与后端定义callback名称
function myFunc(myObj)  {//接受后端返回的参数document.getElementById("demo").innerHTML = myObj;
}
复制代码

cors 设置 CORS 允许跨域资源共享 需要后端设置

{"Access-Control-Allow-Origin": "http://web.xxx.com" //可以指定地址
}
复制代码
{"Access-Control-Allow-Origin": "*" //也可以使用通配符 任何地址都能访问 安全性不高
}
复制代码

使用Vite proxy 或者 node代理 或者 webpack proxy 他们三种方式都是代理

我们先创建一个接口使用express简单构建一下

const express = require('express')
const app = express()//创建get请求
app.get('/xm',(req,res)=>{res.json({code:200,message:"请求成功"})
})
//端口号9001
app.listen(9001)
复制代码

我们使用vite项目的fetch 请求一下


复制代码

 发现是存在跨域的,这时候我们就可以配合vite的代理来解决跨域 用法如下

需要在vite.config.js/ts 进行配置

export default defineConfig({plugins: [vue()],server:{proxy:{'/api':{target:"http://localhost:9001/", //跨域地址changeOrigin:true, //支持跨域rewrite:(path) => path.replace(/^\/api/, "")//重写路径,替换/api}}}
})
复制代码

fetch 替换/api 他会截取/api 替换成 target地址


复制代码

 webpack proxy 和 node proxy 用法都类似

3.vite proxy 原理解析

vite源码地址github.com/vitejs/vite

源码路径 vite/packages/vite/src/node/server/index.ts vite源码 发现他处理proxy 是调用了proxyMiddleware

// proxy                                                            
const { proxy } = serverConfig                              
if (proxy) {                                                middlewares.use(proxyMiddleware(httpServer, proxy, config)) 
}
复制代码

vite/packages/vite/src/node/server/middlewares/proxy.ts

找到 proxyMiddleware 发现他是调用了 http-proxy这个库

import httpProxy from 'http-proxy'
export function proxyMiddleware(httpServer: http.Server | null,options: NonNullable,config: ResolvedConfig): Connect.NextHandleFunction {// lazy require only when proxy is used
const proxy = httpProxy.createProxyServer(opts) as HttpProxy.Server
复制代码

http-proxy npm地址 www.npmjs.com/package/htt…

http-proxy 模块用于转发 http 请求,其实现的大致原理为使用 http 或 https 模块搭建 node 代理服务器,将客户端发送的请求数据转发到目标服务器,再将响应输送到客户端

const http = require('http')const httpProxy = require('http-proxy')const proxy = httpProxy.createProxyServer({})//创建一个代理服务 代理到9001
http.createServer((req,res)=>{proxy.web(req,res,{target:"http://localhost:9001/xm", //代理的地址changeOrigin:true, //是否有跨域ws:true //webSocetk})
}).listen(8888)
复制代码

9001服务

const express = require('express')
const app = express()//创建get请求
app.get('/xm',(req,res)=>{res.json({code:200,message:"请求成功"})
})
//端口号9001
app.listen(9001)
复制代码

成功代理 访问8888端口代理9001的请求

相关内容

热门资讯

修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
【前端】‘??‘与‘||‘有什... 0 问题 经常写const data = res.data.a ?? ''或者const d...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
牛客计算器的改良(Python... 文章目录1.题目描述2.输入描述:3.输出描述:4.示例15.分析6.代码7.结语 链接࿱...
正大杯|市调大赛|2023备赛... 关键信息 同时随着精细化养宠趋势的深入,宠物消费类目日渐丰富。 本报告通过 Niuco...
QGIS下载在线地图(Goog... 前言 国内外有很多在线地图下载软件,但功能单一,基本上只能下载数据&#x...