开发阶段!跨域问题多种解决方案的精华总结

点击上方 前端Q,关注公众号

回复加群,加入前端Q技术交流群

本文作者:方长_beezen

原文链接:https://juejin.cn/post/7367676494977302538

前言

跨域问题是 Web 开发中常见的挑战,源于浏览器的安全策略,限制了页面对不同域名、协议或端口的网络请求。这导致了一系列跨域访问限制,尤其在网页使用 Ajax、WebSocket 等方式与不同域的服务器进行交互时,浏览器会阻止这类请求,以防范潜在的安全风险,如跨站请求伪造(CSRF)攻击。

浏览器跨域报错提示如下:

0671cf1d92fcecb75616f73451bdb2af.png

为了克服跨域问题,开发者可以采用各种技术手段,包括 JSONP、CORS(跨域资源共享),以及前端主动设置 document.domain 等方法。尽管这些解决方案在一定程度上解除了跨域限制,确保了不同域之间的数据交互和通信,但它们也引入了一定的开发成本,增加了项目的复杂度。

在开发过程中,有时我们只是为了临时调试功能,不希望部署复杂的跨域解决方案到「开发环境」。当我们迫切需要一种简单而傻瓜式的跨域解决方案时,能够通过简单配置快速解决问题变得至关重要。

本文将总结一些「非常简便」的跨域解决方案,让你在开发中轻松应对跨域问题的困扰。

「1、绕过浏览器同源策略」

在启动 Chrome 浏览器时,添加 --disable-web-security 参数可用来禁用同源策略。但请注意,这种方式只是在开发和调试时使用,不要在生产环境中禁用同源策略来验收项目。具体操作如下:

「Mac 电脑」,直接在终端命令行中输入如下指令(<自定义目录> 例如:/Users/xxx/MyChromeData) :

$ open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir=<自定义目录>

「Windows 电脑」,右键点击 Chrome 浏览器 -> 属性 -> 目标 -> 在 chrome.exe 路径后面添加代码 --disable-web-security --user-data-dir="<自定义目录>"。(<自定义目录> 例如:D:\MyChromeData)329f000961b414643e96545e21df827c.png

后续打开该 Chrome 浏览器应用,都是以禁用浏览器同源策略的方式打开。如果设置成功了,打开 Chrome 浏览器会有如下提示:

1c79688b3549a6b9e0ab63df55a649b7.png

「2、借助浏览器插件的妙用」

有一些浏览器插件允许在浏览器中启用 CORS 配置,以便在开发过程中更轻松地处理跨域请求,也有一些插件可以帮助临时禁用或修改浏览器的安全设置,以允许跨域请求。以下是一些常见的浏览器插件:

  1. CORS Unblock:」 解除跨域限制。

  2. Allow-Control-Allow-Origin:」 允许跨域资源共享(CORS)。

  3. ModHeader:」 允许用户修改请求头,可以用于测试不同的 CORS 配置。

  4. Postman Interceptor:」 结合 Postman 工具使用,拦截请求和响应,方便测试和调试。

请注意,使用这些插件时应谨慎,仅在开发和调试环境中使用,切勿在生产环境中禁用浏览器的安全设置。

「下面将简单介绍一下 Chrome 插件 CORS Unblock 的使用。」

「步骤一」:在 chrome 应用商店 搜索 CORS Unblock 插件,并点击安装。

2092594eaf5323505414ca03b39464bc.png

「步骤二」:固定插件到导航栏,并点击启用 CORS Unblock 插件。

410d90ac1fff8279b7781063cd52ceea.png

8201c26c7f2856640fe93e54cb993885.png

插件启用

「步骤三」:刷新网页,会发现原本存在跨域限制的接口都可以正常访问了。

「启动插件前」:跨域请求失败

5665055d6905b95b3582e20d90a3230f.png

跨域请求失败

「启动插件后」:跨域请求被自动添加了 CORS 配置,请求成功

13c3640b9d945b834fae4bba4d9b1e3a.png

控制台请求头

3、巧用抓包工具代理请求

抓包工具是一类用于捕获、分析和修改计算机网络通信流量的软件工具。这些工具允许开发人员和网络管理员监控应用程序的网络交互,查看请求和响应的详细信息,进行性能评估,以及在开发和测试阶段修改数据流以进行调试。抓包工具对于诊断网络问题、优化性能和确保安全性都具有重要作用。常用的抓包工具有 「Fiddler」、「Charles」、「Wireshark」 等。

使用抓包工具代理请求的方式来处理跨域问题,通常涉及将 Web 网络请求通过工具进行中间代理,实现对请求和响应的监控、分析和修改。通过抓包工具的 rewrite 能力重写网络响应,给存在跨域的接口都添加上 CORS 相关配置,来解决跨域问题。

下面将简单介绍 Charles 工具的操作步骤:

「步骤一」:打开 Charles 工具栏 Tools --> Rewrite

4ad6957ec3a75cb937d8d206e7bbc185.png

charles

「步骤二」:添加 Rewrite 配置

1b8b7b317155a415d2d0e249b3a2fbb2.png

charles

「步骤三」:Add 时添加 CORS 配置响应头

b28b0db49ecfae43e8452b1dd095c490.png

charles

通过完成上述的三个步骤,我们现在就可以直接访问跨域接口了,可以看到所有的接口响应上都已经被添加了 Access-Control-Allow-Origin:* CORS 属性。

a69b93a76de661b0e44c8f2e68f1e8bb.png

charles

4、运用 devServer.proxy 进行请求代理

devServer.proxy 是 webpack 开发服务器的一个配置选项,通过该选项配置可以在开发环境中实现跨域请求的代理。它解决跨域问题的原理是将前端的请求转发到后端,然后由后端再代理发送请求到目标服务器,最终将响应返回给前端。

所以,如果我们的项目是通过 webpack 启动服务的或者框架底层正好使用了 http-proxy-middleware 服务的,都可以通过配置 devServer.proxy 直接解决跨域问题。

「核心流程如下」:

  1. 「配置 devServer.proxy」

在 webpack 配置文件中的 devServer 部分,通过设置 proxy 选项配置代理。例如:

module.exports = {
  // ...
  devServer: {
    proxy: {
      "/api": {
        target: "http://localhost:3000", // 如果本地使用的后端服务在 localhost:3000 上,可以使用它来启用代理
        changeOrigin: true,
        pathRewrite: { "^/api": "" },
      },
    },
  },
};

上述配置表示将以 /api 开头的请求代理到 http://localhost:3000

  1. 「启动 webpack 开发服务器」

    当开发者启动 webpack 开发服务器时,它会监听前端的请求,并根据 devServer.proxy 的配置将符合条件的请求代理到指定的后端服务器。

  2. 「代理转发」

    当前端发起以 /api 开头的请求时,webpack 开发服务器将请求转发到指定的后端服务器(例如http://localhost:3000)。

  3. 「后端处理请求」

    后端服务器接收到代理过来的请求后,按照正常的处理流程处理请求,并将响应返回。

  4. 「前端接收响应」

    最终,webpack 开发服务器将后端服务器的响应返回给前端,完成整个代理过程。

通过使用 devServer.proxy 配置,前端在开发环境中能够绕过同源策略的限制,实现与后端不同域的服务器进行交互,从而解决跨域问题。这样开发者可以在本地开发环境中方便地与后端服务进行协作和调试。

「http-proxy-middleware 介绍:」

上文所述的 devServer.proxy 代理功能,其底层依赖于  http-proxy-middleware 软件包。所以如果需要设置更多的代理服务配置,可以借鉴参考 http-proxy-middleware 配置文档说明。

http-proxy-middleware 本质上是一个 Node.js 的中间件库,用于在 Express、Koa 或任何基于 Node.js 的 HTTP 服务器上代理 HTTP 请求。

它的工作原理如下:

  1. 当客户端发起 HTTP 请求时,请求首先被发送到代理服务器。

  2. 代理服务器收到请求后,根据配置的规则(如目标地址、路径重写等)修改请求的参数。

  3. 修改后的请求被转发到目标服务器。

  4. 目标服务器接收到请求后,处理请求并返回响应。

  5. 代理服务器接收到响应后,根据配置的规则(如路径重写、请求头修改等)修改响应的参数。

  6. 修改后的响应被返回给客户端。

http-proxy-middleware 可以方便地配置代理规则,支持按路径、按域名、按请求头等进行匹配和过滤,也可以对请求和响应进行修改。通过这种方式,它可以实现反向代理、请求转发、API 接口代理等功能。

5、操作 Nginx 实现反向代理

e07373ac60aaedc2fe80cf1dbea04fa3.png

nginx

Nginx 配置解决浏览器跨域问题的原理是通过反向代理,将「前端应用」和「后端服务」整合在同一域名和端口下。通过在 Nginx 配置文件中设置不同路径的 location 块,将前端请求和后端请求分别代理到对应的服务地址,确保它们具有相同的域名和端口。这样一来,前端页面和后端服务在同一源上,遵循浏览器的同源策略,解决了跨域问题。

在代理过程中,Nginx 还可以添加自定义的请求头信息,确保正确的信息传递和安全性。通过这种方式,Nginx 提供了一种简便有效的解决跨域问题的方法,同时提高了应用的灵活性和安全性。

例如:当前端应用页面部署于 http://10.188.27.166:9897,后端服务接口部署于 http://10.188.27.166:9898,因为两者的端口不一致,所以就会导致跨域请求限制。我们可以通过 nginx.conf 配置,让两者处于同一个域名和端口下,配置如下:

server {
        listen       8080; # 端口
        server_name  localhost; # 域名

    # 代理所有前端页面
        location / {
            proxy_pass http://10.188.27.166:9897;
        }

    # 代理后端接口
        location /cors-api {
            proxy_pass http://10.188.27.166:9898;

      # 添加了部分自定义属性
            add_header Access-Control-Allow-Origin * always;
            add_header Access-Control-Allow-Headers *;
            add_header Access-Control-Allow-Methods "GET, POST, PUT, OPTIONS";
            if ($request_method = 'OPTIONS') {
                return 200;
            }
        }
}

执行 nginx -s reload 命令重新启动 nginx 服务后,我们在浏览器访问 http://localhost:8080/ 地址,跨域限制问题就已经被成功解决了,如下:

6316111c623f7ce20b7b97d947e705c6.png

控制台请求头

最后

以上是一些常见的方式,但请注意谨慎使用,并仅在合适的环境下操作。

突破浏览器安全限制是不被推荐的做法,因为这些限制是为了保障用户和网站的安全。绕过这些限制可能引入潜在的安全风险。然而,有时候在开发和调试阶段,我们可能需要临时禁用浏览器的安全限制。

特别注意,在生产环境中,应该通过合适的方式(如 CORS 配置)来解决跨域问题,而不是绕过浏览器的安全限制。

参考资料

  • webpack devServer.proxy 文档

  • http-proxy-middleware 配置文档

  • Nginx 极简教程

e8ecce998273205645af2463811671b0.png

往期推荐

CSS加载会造成堵塞吗?

278ef4bf43a150e3cb6ecbcc4bf5ddd7.png

vue3自定义hooks大集合,你要的都在这!

391cfccc7240cb4cf1b4d6c0d7a9f755.png

js如何控制一次只加载一张图片,加载完成后再加载下一张

1bfccef865bbe05eb26cece0fa6b782c.png


最后

  • 欢迎加我微信,拉你进技术群,长期交流学习...

  • 欢迎关注「前端Q」,认真学前端,做个专业的技术人...

a84e1fd6edb7a3a62475ebed3777ba6b.jpeg

07edf9640b49c4e82197f65b00083dc0.png

点个在看支持我吧

c8557e76123e82bfd01e54dca4398922.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值