跨域常见的解决方案

article/2025/9/20 4:31:10

目录

一:什么是跨域

二:为什么会跨域

三:跨域的解决方案

1.代理服务器

1.1.生产环境

1.2.开发环境

2.JSONP

3.CORS


一:什么是跨域

跨域是指浏览器在向一个服务器发送请求时,该请求的地址与当前页面的地址不同,即协议、域名、端口号至少有一个不同,导致浏览器出于安全考虑,阻止了页面与请求之间的交互。

 

 

二:为什么会跨域

跨域问题的出现是由于浏览器的同源策略(Same-Origin Policy)所引起的。同源策略是浏览器最核心也最基本的安全策略之一,它是指浏览器只允许与当前网页的协议、域名、端口号完全相同的资源进行交互。

同源策略的存在是出于安全考虑,目的是为了防止恶意的脚本攻击,保障用户信息的安全。如果浏览器允许跨域访问,那么攻击者就可以在自己的网站上注入一些脚本,然后诱导用户在访问其他网站时自动执行这些脚本,从而达到攻击的目的。因此,同源策略是浏览器保护用户安全的重要措施之一。

三:跨域的解决方案

1.代理服务器

在日常的项目开发中,解决跨域问题最常使用的方案是使用代理服务器

代理服务器解决跨域问题其实是利用了同源策略只受限于浏览器访问服务器对于服务器访问服务器并没有限制的特点,作为中间服务器做了一个请求转发的功能。

具体来说,就是当前端网页在浏览器中发起网络请求时,其实这个请求是发送到代理服务器上的,然后代理服务器会将请求转发给目标服务器,再将目标服务器返回的响应转发给客户端。

值得一提的是,在生产环境和开发环境中,我们通常会使用不同的方式实现代理

1.1.生产环境

在线上环境下,我们一般会采用nginx来做反向代理

下面是通过 Nginx 反向代理解决跨域问题的步骤:

1.修改 Nginx 的配置文件,在 http 块中添加以下内容:

http {# 允许跨域请求的地址add_header 'Access-Control-Allow-Origin' '*';# 允许跨域请求的方法add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';# 允许跨域请求的请求头add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization';# 允许跨域请求的请求头中可以携带的信息add_header 'Access-Control-Expose-Headers' 'Authorization';# 允许跨域请求携带 Cookieadd_header 'Access-Control-Allow-Credentials' 'true';...
}

2.在 server 块中添加以下内容:

server {listen 80;server_name example.com;# 将 /api 转发到 http://api.example.comlocation /api {proxy_pass http://api.example.com;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

这个配置表示将客户端请求的 /api 转发到 http://api.example.com,并将客户端请求的头信息中的 Host 和 X-Real-IP 添加到后端请求的头信息中。这样就可以通过 Nginx 反向代理解决跨域问题了。

通过 Nginx 反向代理解决跨域问题的优点是可以集中管理跨域请求,缺点是需要额外的服务器和维护成本。

1.2.开发环境

在开发环境下,我们可以通过修改本地开发服务器的配置文件或者在前端代码中添加跨域相关的代码来解决跨域问题,下面我以Vue中的项目为例

如果是通过vue-cli脚手架工具搭建项目,我们可以通过webpack为我们起一个本地服务器作为请求的代理对象。在vue.config.js文件,新增以下代码

module.exports = {devServer: {proxy: {'/api': { // '/api'是代理标识,用于告诉node,url前面是/api的就是使用代理的target: "http://xxx.xxx.xx.xx:8080", //目标地址,一般是指后台服务器地址changeOrigin: true, //是否跨域pathRewrite: { // pathRewrite 的作用是把实际Request Url中的'/api'用""代替'^/api': "" }}}}
}

2.JSONP

JSONP(JSON with Padding)是一种跨域解决方案,它利用 script 标签的 src 属性不受同源策略限制的特性,通过在服务端返回 JSON 数据的同时,将数据包裹在一个回调函数中返回给前端,从而实现跨域请求

下面是使用 JSONP 的示例代码:

function jsonp(url, callback) {const script = document.createElement('script');script.src = url + '&callback=' + callback;document.body.appendChild(script);
}function handleData(data) {console.log(data);
}jsonp('http://example.com/api/data?param=value', 'handleData');

在上述代码中,我们定义了一个 jsonp 函数,它接收一个 URL 和回调函数名作为参数。在函数内部,我们创建了一个 script 标签,并将 URL 和回调函数名拼接到其中。最后,将该 script 标签添加到文档中,从而触发跨域请求。

虽然 JSONP 能够解决跨域的问题,但是它也存在一些缺点,主要包括以下几点:

  1. 仅支持 GET 请求:JSONP 是通过动态创建 script 标签实现的,因此只支持 GET 请求,无法支持 POST 请求和其他类型的请求。

  2. 安全性问题:JSONP 的安全性问题比较容易被攻击者利用,攻击者可以通过修改 JSONP 的回调函数来注入恶意代码,从而对网站造成安全威胁。

  3. 无法处理错误:由于 JSONP 是通过 script 标签加载数据的,因此无法捕获请求失败的情况,无法处理错误信息。

总的来说,JSONP 是一种比较古老的跨域解决方案,虽然它能够解决一部分跨域问题,但是由于存在以上缺点,因此在现代化的应用中,通常采用其他更加安全、可靠的跨域解决方案,例如 CORS、反向代理等。

3.CORS

CORS (Cross-Origin Resource Sharing,跨域资源共享),它由一系列传输的HTTP头组成,这些HTTP头决定浏览器是否阻止前端 JavaScript 代码获取跨域请求的响应

CORS 实现起来非常方便,只需要增加一些 HTTP 头,让服务器能声明允许的访问来源 。只要后端实现了 CORS,就实现了跨域

koa框架举例  添加中间件,直接设置Access-Control-Allow-Origin响应头

app.use(async (ctx, next)=> {ctx.set('Access-Control-Allow-Origin', '*');ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');await next()  
})

CORS(跨域资源共享)是目前较为常用的一种跨域解决方案,它相对于 JSONP 等传统的跨域解决方案,有以下优点和缺点:

优点:

  1. 安全性高:CORS 在浏览器端和服务器端都支持,能够在保证安全性的前提下,允许不同源的客户端请求服务器端资源,避免了 JSONP 可能存在的安全问题。

  2. 支持所有类型的HTTP请求:CORS 不仅支持简单请求(GET、POST、HEAD)的跨域请求,还支持复杂请求(PUT、DELETE、OPTIONS、PATCH)等其他类型的跨域请求。

  3. 灵活性高:CORS 支持配置多种不同类型的请求头和响应头,具有更高的灵活性和扩展性。

  4. 与标准相符:CORS 是 W3C 标准,与现代 Web 开发技术相符,能够支持更多的跨域场景。

缺点:

  1. 配置复杂:CORS 的配置比较复杂,需要在服务器端进行一定的设置和配置,对于一些不熟悉 CORS 的开发人员来说,可能需要花费更多的时间和精力。

  2. 兼容性问题:CORS 是现代 Web 开发技术的一部分,旧版本的浏览器可能不支持或支持不完全,需要进行兼容性处理。

  3. 存在预检请求:对于一些复杂的请求(如带有自定义头信息的请求),浏览器会发送一个预检请求(Preflight),增加了请求的开销和网络传输的负担。

综上所述,CORS 是一种相对于传统跨域解决方案更加安全、灵活和标准的解决方案,但是配置比较复杂,兼容性和预检请求等问题需要进行处理。


http://chatgpt.dhexx.cn/article/321hi3L1.shtml

相关文章

React跨域解决方案

一、业务场景: 前后端数据交互时会存在跨域的情况,这个时候就比较难受。传统的解决方案有三种,分别是 Jsonp:但是只能处理get请求 后端CORS:配置注解CrossOrigin(用的最多) 反向代理 &#xff1…

10 种跨域解决方案(附终极方案)

写在前面 嗯。又来了,又说到跨域了,这是一个老生常谈的话题,以前我觉得这种基础文章没有什么好写的,会想着你去了解底层啊,不是很简单吗。但是最近在开发一个 vscode 插件 发现,当你刚入门一样东西的时候&…

可能是最好的跨域解决方案了

今天我们来聊一个老生常谈的话题,跨域!又是跨域,烦不烦 ?网上跨域的文章那么多,跨的我眼睛都疲劳了,不看了不看了 🤣 别走...我尽量用最简单的方式将常见的几种跨域解决方案给大家阐释清楚&…

跨域问题解决方案

跨域问题产生的前提条件 必须要有浏览器,没有浏览器,是不存在跨域问题。浏览器为了安全问题,限制了跨域访问,不允许跨域请求资源。 跨域 浏览器从一个域名的网页去请求另一个域名的资源,域名、端口、协议有任何一个…

跨域理解与解决方案

一 、跨域是啥 为啥会发生? 跨域本质是浏览器基于同源策略的一种安全手段,是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础…

Vue中的跨域解决方案

前言 跨域是因为浏览器存在对不同源页面数据接收的限制。这种限制就是浏览器的同源策略。 同源策略是浏览器的安全机制,跨域的原理就是通过各种方式避开浏览器的安全机制 使用 在项目开发时,对跨域的概念仅限于了解,所以没有注重过程&#xf…

Vue跨域解决方案

文章目录 前言一、跨域是什么?二、解决跨域的办法 前言 跨域错误信息 Access to XMLHttpRequest at ‘http://192.168.2.92:3000/api/b/home’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: Response to preflight request doesn’t …

跨域的几种解决方案(详细)

跨域的几种解决方案 1.什么是跨域2.演示用axios请求网易新闻地址,发现跨域出错3.解决跨域方式3.1 jsonp方式3.2 cors方式3.3 proxy代理转发 1.什么是跨域 .网页所在url的协议、域名、端口号,和Ajax请求url的协议、域名、端口号有一个对应不上&#xff0…

跨域9大解决方案(超详细) 总结

前面的话 我们经常听到跨域这词,这是由于浏览器同源策略限制的一类请求场景。这样做的目的使得 浏览器不容易受到攻击。 推荐文章:九种跨域方式实现原理(完整版) 什么是同源策略? 同源策略(Same origin…

前端跨域解决方案

文章目录 注意,本文已迁移 1.同源政策2.跨域解决方案2.1 CORS普通跨域请求:只需服务端设置Access-Control-Allow-Origin即可携带cookie跨域请求:前后端都需设置 2.2 postMessage跨域2.3 JSONP原理缺点数据格式jsonp跨域实现 2.4 WebSocket属性…

解决跨域的三种方案

解决跨域的三种方案 到目前为止,我们编写的 GET 和 POST 接口,存在一个很严重的问题:不支持跨域请求 解决接口跨域问题的方案主要有三种 CORS (主流的解决方案,推荐使用) 代理 (推荐使用) JSONP (有缺陷的解决方案&#xff1a…

跨域的五种解决方案详解

1.跨域解决方案一:cors技术 CORS :全称cross origin resource share (资源共享) 工作原理: 服务器 在返回响应报文的时候,在响应头中 设置一个允许的header res.setHeader(‘Access-Control-Allow-Origin’, ‘*’) CORS :全称…

Java中parseInt用法(double类似)

1.将字符直接解析为十进制数进行输出 2.如果方法有两个参数, 使用第二个参数指定的基数,将字符串参数解析为有符号的10进制整数。(所谓指定基数:就是将字符串指定为2,8,16等进制数,然后用解析为…

javascript:parseInt用法,特殊用法,进制转换

parseInt( string,radix ) 一、功能: 除了我们众所周知的字符串转换为整数以外,还涉及到进制问题: 将 [ 指定进制的 ] 字符串转换为十进制整数型 用汉语翻一下这个方法: 二、参数: 1、string: 要解析的字符串&a…

前端JS字符串转数值 Number和parseInt用法

Number() 只包含数值的字符串字符串为空则为0 parseInt() 字符串不能为空字符串第一个必须为数值从第一个数值开始取,到最后一个连续数值结束

java中Integer.parseInt用法详细分析(全)

目录 前言函数讲解 前言 将数字字符串转化成原生整型数据 属于java.lang.Integer 是原生类型整型的包裹类 函数讲解 1.parseInt(String s) 将字符串s转换为十进制的数字,默认为十进制 public static void main(String[] args) {int numInteger.parseInt("10…

parseInt用法

MDN: 从给定的字符串中解析出的一个整数。 代码&#xff1a; <script>var aparseInt("100px");console.log("a:"a" type:"typeof(a));</script>效果&#xff1a;

parseInt鲜为人知的用法

用法一&#xff1a;将小数转换成整数 var float_num 3.14;float_num parseInt(float_num);console.log(float_num);输出结果&#xff1a; 用法二&#xff1a;以数字开头的字符变量转换成整数 var str_num 3.14string;str_num parseInt(str_num);console.log(str_num);输出…

javax.servlet.http.HttpServletRequest错误

javax.servlet.http.HttpServletRequest错误 javax这个api出错 问题分析&#xff1a;javax.api找不到。 解决方案&#xff1a; 方案一&#xff1a; 可以再maven的pom.xml文件中导入方案二&#xff1a; idea没有导入tomcat下的lib目录下的api,我们手动导入就可以。 步骤如下&a…

java: 程序包javax.validation不存在

之前&#xff0c;有位同学反馈说&#xff0c;在运行newbee-mall-api项目时遇到了下面这个问题&#xff0c;无法正常编译项目&#xff0c;错误截图如下&#xff1a; 看了一下应该是NotEmpty、Valid这几个验证注解引起的&#xff0c;因为这几个注解都是定义在javax.validation包…