webpack proxy如何解决跨域问题

 更新时间:2023年10月24日 15:46:13   作者:嚣张农民  
webpack proxy,即webpack提供的代理服务,基本行为就是接收客户端发送的请求后转发给其他服务器,本文给大家介绍了webpack proxy如何解决跨域问题,感兴趣的朋友跟随小编一起看看吧

webpack proxy如何解决跨域?

一、是什么

webpack proxy,即webpack提供的代理服务

基本行为就是接收客户端发送的请求后转发给其他服务器

其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制)

想要实现代理首先需要一个中间服务器,webpack中提供服务器的工具为webpack-dev-server

webpack-dev-server

webpack-dev-server是 webpack 官方推出的一款开发工具,将自动编译和自动刷新浏览器等一系列对开发友好的功能全部集成在了一起

目的是为了提高开发者日常的开发效率,只适用在开发阶段

关于配置方面,在webpack配置对象属性中通过devServer属性提供,如下:

// ./webpack.config.js
const path = require('path')

module.exports = {
    // ...
    devServer: {
        contentBase: path.join(__dirname, 'dist'),
        compress: true,
        port: 9000,
        proxy: {
            '/api': {
                target: 'https://api.github.com'
            }
        }
        // ...
    }
}

devServetr里面proxy则是关于代理的配置,该属性为对象的形式,对象中每一个属性就是一个代理的规则匹配

属性的名称是需要被代理的请求路径前缀,一般为了辨别都会设置前缀为 /api,值为对应的代理匹配规则,对应如下:

  • target:表示的是代理到的目标地址
  • pathRewrite:默认情况下,我们的 /api-hy 也会被写入到URL中,如果希望删除,可以使用pathRewrite
  • secure:默认情况下不接收转发到https的服务器上,如果希望支持,可以设置为false
  • changeOrigin:它表示是否更新代理后请求的 headers 中host地址

二、工作原理

proxy工作原理实质上是利用http-proxy-middleware 这个http代理中间件,实现请求转发给其他服务器

举个例子:

在开发阶段,本地地址为http://localhost:3000,该浏览器发送一个前缀带有/api标识的请求到服务端获取数据,但响应这个请求的服务器只是将请求转发到另一台服务器中

const express = require('express');
const proxy = require('http-proxy-middleware');

const app = express();

app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));
app.listen(3000);

// http://localhost:3000/api/foo/bar -> http://www.example.org/api/foo/bar

三、跨域

在开发阶段, webpack-dev-server 会启动一个本地开发服务器,所以我们的应用在开发阶段是独立运行在 localhost 的一个端口上,而后端服务又是运行在另外一个地址上

所以在开发阶段中,由于浏览器同源策略的原因,当本地访问后端就会出现跨域请求的问题

通过设置webpack proxy实现代理请求后,相当于浏览器与服务端中添加一个代理者

当本地发送请求的时候,代理服务器响应该请求,并将请求转发到目标服务器,目标服务器响应数据后再将数据返回给代理服务器,最终再由代理服务器将数据响应给本地

在代理服务器传递数据给本地浏览器的过程中,两者同源,并不存在跨域行为,这时候浏览器就能正常接收数据

注意:服务器与服务器之间请求数据并不会存在跨域行为,跨域行为是浏览器安全策略限制

参考文献

https://webpack.docschina.org/configuration/dev-server/#devserverproxy

使用webpack的proxy来解决跨域

使用webpack的proxy来解决跨域问题

什么是跨域

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的。javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

解决思路

使用前端服务IP和端口来访问后端接口地址,然后通过webpack的代理,访问实际的接口地址。就是遵守浏览器的游戏规则。

注意点:

axios的base_url一定是自己本地的,可以不写,默认就是当前服务地址。

target是后端的接口地址,也就是说我们在vue.confjg.js里面的taget写的是实际的请求地址。

可以使用webpack_proxy来解决跨域(主要说的是这里)

vue.config.js

const {defineConfig} = require('@vue/cli-service')
module.exports = defineConfig({
    transpileDependencies: true,
    devServer: {
        proxy: {
            "/api": {
                target: process.env.VUE_APP_BASE_URL, // todo 请注意,这里是后端的地址,这里不是本地的!!!!
                ws: false, // websocket
                secure: false, // 是否支持https
                changeOrigin: true, // 是否跨域
            }
        }
    }
})


.env.development

env="development"
VUE_APP_BASE_URL = "http://localhost:8000"

Api.ts

/*
@description:
@auther: alex
@data: 12/23/22
*/
import axios, {AxiosResponse} from "axios";

// const instance = axios({
//     method: "post",
//     baseURL: "", // 因为要启用代理,所以所以这里可以不用写,默认为当前服务的IP和端口
//     timeout: 10000,
// })

const instance = axios.create({
    method: "post",
    baseURL: "",
    timeout: 10000,
})
export const post = (url: string, params: any): Promise<AxiosResponse> => {
    return instance.post(url, params)
}

export const get = (url: string, params: any): Promise<AxiosResponse> => {
    return instance.get(url, params)
}


到此这篇关于webpack proxy如何解决跨域?的文章就介绍到这了,更多相关webpack proxy解决跨域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript快速排序算法不同版本原理解析

    JavaScript快速排序算法不同版本原理解析

    这篇文章主要为大家介绍了JavaScript快速排序算法不同版本原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 微信APP生命周期及页面生命周期示例详解

    微信APP生命周期及页面生命周期示例详解

    这篇文章主要为大家介绍了微信APP生命周期及页面生命周期当然示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 关于页面嵌入swf覆盖div层的问题的解决方法

    关于页面嵌入swf覆盖div层的问题的解决方法

    这篇文章主要介绍了关于页面嵌入swf覆盖div层的问题的解决方法,需要的朋友可以参考下
    2014-02-02
  • js中获取一个月有多少天数的方法

    js中获取一个月有多少天数的方法

    这篇文章主要介绍了js中获取一个月有多少天的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • wangEditor富文本编译器插件学习系列之工具栏配置

    wangEditor富文本编译器插件学习系列之工具栏配置

    这篇文章主要给大家介绍了关于wangEditor富文本编译器插件学习系列之工具栏配置的相关资料,wangEditor是一款基于原生JavaScript封装,开源免费的富文本编辑器,支持常规的文字排版操作、插入图片、插入视频、插入代码等功能,需要的朋友可以参考下
    2023-12-12
  • JavaScript中的方法调用详细介绍

    JavaScript中的方法调用详细介绍

    这篇文章主要介绍了JavaScript中的方法调用详细介绍,JavaScript中,如果function属于一个对象,那么通过对象来访问该function的行为称之为“方法调用”,需要的朋友可以参考下
    2014-12-12
  • js实现头像上传并且可预览提交

    js实现头像上传并且可预览提交

    这篇文章主要介绍了js如何实现头像上传并且可预览提交,帮助大家更好的理解和使用js,感兴趣的朋友可以了解下
    2020-12-12
  • js运动应用实例解析

    js运动应用实例解析

    这篇文章主要针对js运动应用进行实例解析
    2015-12-12
  • JavaScript中的ubound函数使用实例

    JavaScript中的ubound函数使用实例

    这篇文章主要介绍了JavaScript中的ubound函数使用实例,本文先是讲解了ubound函数的语法,然后给出了用法代码实例,需要的朋友可以参考下
    2014-11-11
  • 高效的表格行背景隔行变色及选定高亮的JS代码

    高效的表格行背景隔行变色及选定高亮的JS代码

    一个项目要用,又不想用jquery之类的东东。先去网上搜索了下,找到了不少在CSS中执行JS的表格行变色方式,不过这类方式在表格行多的时候相当卡,在IE7和firefox3中测试正常。
    2010-12-12

最新评论