首页/文章/http-网络

跨域的五种最常见解决方案

2023-12-22
12335 分钟
...

这是一篇笔记

跨域不是问题,是一种安全机制。浏览器有一种策略名为_同源策略,同源策略规定了部分请求不能被浏览器所接受。_

值得一提的是:同源策略导致的跨域是浏览器单方面拒绝响应数据,服务器端是处理完毕并做出了响应的。

什么是同源策略

一个url由三部分组成:协议,域名(ip地址),端口

只有当协议,域名,端口都一致的时候,才被称为同源。

而同源策略规定,只有发送请求的那一边和接受请求的那一边处于同源的情况下,浏览器才会接受响应。

举个例子

发送请求地址:http:47.96.127.5:8080/index    接受请求地址:http:47.96.127.5:8081/index //不同源 端口不同
发送请求地址:http:47.96.127.5:8080/index     接受请求地址:http:47.96.127.6:8080/index //不同源 ip不同
发送请求地址:http:47.96.127.5:8080/index     接受请求地址:https:47.96.127.5:8080/index //不同源 协议不同
发送请求地址:http:47.96.127.5:8080/index     接受请求地址:http:47.96.127.5:8080/login //同源 协议,端口,ip都相同,路径不同无所谓

而当我们的请求不符合同源策略的时候。往往会出现以下错误👇

第一种:JQuery的ajax(推荐JQuery项目中使用)

jq的ajax自带解决跨域的方法。底层原理采用的JSONP的跨域解决方案。如下

function callback(){
    console.log("月薪一千五,心比美式苦")
}

$.ajax({
    url: 'http://www.domain2.com:8080/login',
    type: 'get',
    dataType: 'jsonp',  
    jsonpCallback: "callBack",  
});

在JQ项目中,这是最常见的解决方案。

第二种:script标签解决跨域(远古Web项目中使用)

如果你的项目是祖传下来的。没有框架连JQuery都没有。没关系,我们可以尝试使用原生的方法去解决。

原生采用的是script标签可以不受跨域限制的特性来实现跨域。

  <script>
            
            function callBack(res) {
                console.log("跨域的回调",res);
               
               document.head.getElementsByClassName("script")[0].remove();
            }

            const scriptDom = document.createElement('script');
            scriptDom.type = 'text/javascript';
            scriptDom.class = 'script'; 
            
            scriptDom.src = 'http://192.167.0.152:9996/inface?callback=callBack';
            document.head.appendChild(script); 
        </script>

这里需要注意的是,使用完请求之后记得删除script,否则会随着请求的变多script标签会一直挂载在DOM上。

在远古的web中,这是一种方案。但现在已经不用了。

vue/react/jq等框架性项目中不要使用这种方法,不是不行,只是有更好的选择

第三种:前端代理解决跨域

每一个框架的代理配置都不太一样。这里仅以我使用的umi.js(react)为例。

Umi.js框架会有 config.ts / config.js 文件,文件中会有_proxy_字段、字段按图中配置方法。即可完成跨域

第四种:服务端代理(Nginx代理)

nginx代理一般使用在生产环境。是服务端解决跨域的一种方案。

简单配置模板👇


server {
     listen       80; 
        server_name  www.xxx.com;
        
        location /api/ { 
            proxy_pass http://www.yyy.com:9999; 
        }
}

注意,nginx配置完代理后需要重启nginx,nginx代理是生产环境的常用方案

第五种:后台(逻辑层)添加响应头解决

_Access-Control-Allow-Origin_响应头的意思是,安全同行的请求。

举个例子 http://192.168.0.103:8080http://192.168.0.102:8080 发送了请求,结果因为域名不一样,在返回信息的时候因为_IP地址不一致_被拦截。

但是如果http://192.168.0.102:8080 在响应头中的 Access-Control-Allow-Origin 字段中携带上属性值'http://192.168.0.103:8080' 如下


Access-Control-Allow-Origin':'http:/ /192.168.0.103:8080'

这就等于告诉浏览器,http://192.168.0.102:8080 这个地址是安全的,请不要拦截。

这样,http://192.168.0.103:8080 就可以接受来自 http://192.168.0.102:8080 返回的信息。

当然,我们也可以进行所有域名均不拦截的设置(如下)



Access-Control-Allow-Origin':'*'

node案例如下

res.writeHead(200, {
    Access-Control-Allow-Origin':'http:
});



res.writeHead(200, {
    Access-Control-Allow-Origin':'*'
});


并不建议此种方案,因为安全性不高。自己写小练习的时候建议使用,因为真的很方便。

跨域的常见的五种解决方案如下

  1. jsonp,代表:jquery的$.ajax。(仅限JQuery项目使用)
  2. script标签解决跨域(远古web使用的方案,已不建议使用)
  3. 前端代理
  4. nginx代理
  5. 设置响应头(不建议使用,安全性不高,小练习可以用用,方便)

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
http-网络2025-10-27
frp-内网穿透详解
1\. 简介与工作原理 frp(Fast Reverse Proxy)是一个高性能的反向代理 / 内网穿透工具。典型部署模式: 在 公网 VPS 上运行 (服务端),监听来自 的 出站持久连接 (控制端口,通常 7000)。 在 内网机器 上运行 (客户端),与 frps 建立长连接并注册若干映射(如 tcp/http)。 当外部请求到达 frps(公网),frps 根据路由规则把流量转发回对应的 frpc 连接,再由 frpc 转发到...
学习
http-网络2025-10-13
内网穿透介绍
&nbsp; 1\. 简要概念与为什么需要内网穿透 大多数家庭/公司网络在私有网(RFC1918)后面,通过 NAT 共享一个公网 IP。NAT 允许内网对外发起连接,但阻止公网主动连入。 内网穿透 就是建立从公网到内网的可达通道,常用于:Webhook 回调、远程演示、远程管理、IoT 设备接入、远程调试等。 2\. 核心原理(三行总结) 反向连接 :内网主动连到公网穿透服务器,建立一条"回路"。 中继/代理 :穿透服务器把外部流量中...
学习
http-网络2025-08-06
按下回车后网页是怎么出来的
当你在浏览器中输入一个网址,比如 ,然后按下回车键,几秒钟后页面就完整地呈现在你眼前。这个看似简单的操作,背后其实是一整套精密协作的网络机制在起作用。本文将带你从基础讲起,理解 Web 开发中最重要的网络知识,帮助你搞清楚: 数据是如何从服务器传到你的电脑,并最终变成网页的? 一、互联网通信的分层模型:OSI 七层模型 为了管理复杂的网络通信,工程师们提出了一个通用的参考模型—— OSI 七层模型 。它把整个通信过程划分为七个层次,每一...
学习面试
http-网络2025-06-20
MQTT与HTTP在物联网中的比较:为什么MQTT是更好的选择
简介: 通过上述分析,可以看出MQTT在物联网应用中的确是更好的选择。其高效的通信模型、低带宽消耗、稳定的连接保持机制以及可靠的消息质量保证,使其在各种物联网场景中都能表现出色。开发者在设计和实现物联网系统时,应优先考虑采用MQTT协议,以充分发挥其在资源受限环境下的优势,提升系统的整体性能和可靠性。 【杂谈】 MQTT与HTTP在物联网中的比较:为什么MQTT是更好的选择 在物联网(IoT)应用中,选择合适的通信协议是实现高效、可靠数...
学习
http-网络2025-03-04
网络代理详解
一、 的基础概念 1\. 什么是代理? 代理是一种通过中间服务器来帮助 访问目标服务器的技术。代理服务器位于客户端与服务器之间,充当两者的中介,从而实现客户端和服务器之间的隔离。用户的所有请求经过代理后,再发往目标服务器,而目标服务器的响应则返回代理,再由代理传递给用户。 2\. 网络代理的工作流程 在基本的网络代理工作流程中, 扮演了“请求转发者”和“响应返回者”的角色: 1. 客户端请求 :客户端将请求发送到代理服务器,而不是直接发...
学习面试
http-网络2024-11-29
没有koa的cors你怎么处理跨域?
关联问题: JSONP有何局限性 CORS如何处理复杂请求 代理在生产环境效果如何 前言 “金九银十”的秋招,就像是落进池塘的羽毛,连点水花都没砸起来。已读不回是常态,能给面试已是情分,能拿offer的更是少之又少。可怜我在寒潮来临的深秋之际,也只得哀叹一句“越来越冷了啊...” 不过人总是要吃饭的,所以再怎么冷,卖炭翁也得卖炭,牛马攻城狮也得“攻城”,既是为了填饱肚子,也是为了“春天”做准备。所以今天为各位前端工程狮细聊一下前端面试中...
学习面试

评论

请登录后发表评论

去登录
加载评论中...

目录