常见的浏览器跨域解决方法
1. 前端方法:JSONP(仅适用于GET请求)
JSONP(JSON with Padding)是一种利用<script>标签的src属性不受同源策略限制的特性来实现跨域数据请求的方法。JSONP通过在前端动态创建<script>标签,并将请求的URL设置为需要跨域访问的API地址,来获取跨域数据。
前端代码示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JSONP Example</title>
</head>
<body><script>function handleResponse(data) {console.log(data); // 处理返回的JSON数据}// 动态创建script标签var script = document.createElement('script');script.src = 'http://example.com/api?callback=handleResponse';document.body.appendChild(script);
</script></body>
</html>
后端代码示例(Node.js使用Express):
const express = require('express');
const app = express();
const port = 3000;app.get('/api', (req, res) => {const callback = req.query.callback; // 获取前端传递的回调函数名const data = { message: 'Hello, JSONP!' }; // 要返回的数据// 构建JSONP格式的响应res.send(`${callback}(${JSON.stringify(data)})`);
});app.listen(port, () => {console.log(`Server is running on port ${port}`);
});
2. 后端方法:CORS(跨来源资源共享)
CORS是一种W3C规范,它允许浏览器向跨源服务器发出XMLHttpRequest请求。要实现CORS,后端服务器需要在响应头中设置相应的CORS头部。
前端代码示例:
// 使用Fetch API发送请求
fetch('http://example.com/api', {method: 'GET',mode: 'cors', // 表明这是一个跨域请求headers: {'Content-Type': 'application/json'}
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
后端代码示例(Node.js使用Express):
const express = require('express');
const app = express();
const port = 3000;// 使用CORS中间件
const cors = require('cors');
app.use(cors()); // 允许所有来源的跨域请求app.get('/api', (req, res) => {const data = { message: 'Hello, CORS!' };res.json(data);
});app.listen(port, () => {console.log(`Server is running on port ${port}`);
});
在上面的后端示例中,我们使用了cors中间件来简化CORS头部的设置。这个中间件可以配置来允许特定来源的请求,或者使用通配符*来允许所有来源的请求。
3. 前端配置代理(Proxy)
在Web开发中,使用webpack的devServer配置代理是一种常见的方法来解决跨域问题,特别是在开发环境中。webpack-dev-server提供了一个proxy选项,允许你指定一些规则来将特定的请求代理到另一个服务器。
以下是如何在webpack的devServer配置中使用proxy来解决跨域问题的示例:
首先,确保你已经安装了webpack和webpack-dev-server。如果没有,你可以通过npm或yarn来安装它们:
npm install --save-dev webpack webpack-dev-server
# 或者
yarn add --dev webpack webpack-dev-server
然后,在你的webpack配置文件(通常是webpack.config.js或webpack.dev.js)中,添加devServer字段,并在其中配置proxy选项:
const path = require('path');module.exports = {// ...其他webpack配置...devServer: {contentBase: path.join(__dirname, 'dist'), // 静态文件目录compress: true, // 开启gzip压缩port: 9000, // 端口号proxy: {// 选项写法'/api': {target: 'http://example.com', // 目标地址ws: true, // 是否启用websocketschangeOrigin: true, // 开启代理,在本地创建一个虚拟服务器,然后发送请求的数据,会同时会收到请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题pathRewrite: {'^/api': '' // 路径重写,移除路径中的/api},router: {// 当请求不匹配任何代理规则时,请求会到达这个路由'/': 'http://example.com'}},// 简写选项'/foo': 'http://example.com'}}
};
在上面的配置中,所有以/api开头的请求都会被代理到http://example.com。changeOrigin选项设置为true,这样代理就会改变请求头中的Origin,确保它与目标服务器的Origin一致,从而避免CORS问题。pathRewrite选项用于重写请求路径,移除/api前缀。
现在,当你运行webpack-dev-server时(通常是通过npx webpack serve或npm run serve等命令),任何发送到/api的请求都会被代理到http://example.com,而浏览器不会遇到跨域问题。
请确保将target的值替换为你想要代理的实际API服务器的地址。此外,根据你的需要,你可能还需要调整其他代理选项,如ws(用于WebSockets)、pathRewrite、router等。
4. 代理服务器:
代理服务器是一个位于客户端和目标服务器之间的中间服务器。客户端的请求首先发送到代理服务器,然后由代理服务器转发到目标服务器。代理服务器可以在不同的域中运行,因此它可以绕过浏览器的同源策略限制。前端向代理服务器发送请求,代理服务器再向目标服务器发送请求,并将结果返回给前端。这种方法不需要修改前端或目标服务器的代码。
5. WebSockets:
WebSocket是一种网络通信协议,它允许在用户的浏览器和服务器之间建立一条持久的连接。与HTTP不同,WebSocket连接不受同源策略的限制,因此可以用来解决跨域问题。然而,需要注意的是,并非所有服务器都支持WebSocket,并且它可能不适用于所有类型的跨域通信。
6. 反向代理:
反向代理服务器通常部署在网站的前端,用于接收客户端的请求,然后将这些请求转发给后端服务器。由于反向代理服务器与客户端处于同一域下,它可以绕过同源策略限制,将跨域请求转发给后端服务器。这种方法需要配置服务器端的反向代理软件,如Nginx或HAProxy。
7. 浏览器插件或扩展:
一些浏览器插件或扩展可以修改浏览器的行为,以允许跨域请求。然而,这种方法并不推荐在生产环境中使用,因为它依赖于用户的浏览器设置和安装的插件,不可控因素较多。
8. 修改浏览器设置:
在某些情况下,可以通过修改浏览器的设置来允许跨域请求。例如,在Chrome浏览器中,可以启动开发者模式并禁用同源策略。然而,这种方法仅适用于开发和测试环境,不建议在生产环境中使用。
9. 使用CDN:
通过内容分发网络(CDN)来解决跨域问题。CDN可以将资源缓存在不同的域名下,前端可以通过CDN的地址来加载资源,从而绕过同源策略限制。
注意事项
- JSONP只能用于GET请求,因为它基于
<script>标签的src属性。 - CORS是一种更现代、更灵活的方法,支持所有类型的HTTP请求。
- 前后端需要协作来解决跨域问题,前端负责发起请求,后端负责配置CORS头部来允许跨域请求。
- 在生产环境中,后端应该仔细配置CORS策略,只允许可信的源进行跨域请求,以增强系统的安全性。
相关文章:
常见的浏览器跨域解决方法
1. 前端方法:JSONP(仅适用于GET请求) JSONP(JSON with Padding)是一种利用<script>标签的src属性不受同源策略限制的特性来实现跨域数据请求的方法。JSONP通过在前端动态创建<script>标签,并将…...
飞桨模型转ONNX模型教程
文章目录 飞桨模型转ONNX模型教程1. ONNX简介2. Paddle2ONNX安装3. 获取Paddle2ONNX模型库4. 飞桨转ONNX教程4.1 飞桨训练模型导出为ONNX模型4.2 飞桨部署模型转为ONNX模型4.3 验证ONNX模型4.4 使用ONNX模型进行推理 5. 注意事项 飞桨模型转ONNX模型教程 1. ONNX简介 ONNX是一…...
vue使用swiper(轮播图)-真实项目使用
一、安装 我直接安装的vue-awesome-swiper": "^3.1.3"指定版本 npm install vue-awesome-swiper3.1.3 swiper --save二、vue页面使用,写了一个小demo <template><div class"vue-swiper"><h1>{{ msg }}</h1><…...
C++ 创建并初始化对象
创建并初始化C对象 当我们创建一个C对象时,它需要占用一些内存,即使我们写一个完全为空的类,类中没有成员,什么也没有,它至少也要占用一个字节的内存。但是我们类中有很多成员,它们需要存储在某地方&#…...
大数据可视化python01
import pandas as pd import matplotlib.pyplot as plt# 设置中文改写字体 plt.rcParams[font.sans-serif] [SimHei]# 读取数据 data pd.read_csv(C:/Users/wzf/Desktop/读取数据进行数据可视化练习/实训作业练习/瓜果类单位面积产量.csv ,encoding utf-8)#输出 print(data)…...
Java底层自学大纲_分布式篇
分布式专题_自学大纲所属类别学习主题建议课时(h)A 分布式锁001 Zookeeper实现分布式锁l-常规实现方式2.5A 分布式锁002 Zookeeper实现分布式锁II-续命&超时&羊群效应问题解决方案2.5A 分布式锁003 Zookeeper实现分布式锁III-基于Curator框架实现…...
Thread多线程(创建,方法,安全,通信,线程池,并发,并行,线程的生命周期)【全详解】
目录 1.多线程概述 2.多线程的创建 3.Thread的常用方法 4.线程安全 5.线程同步 6.线程通信 7.线程池 8.其它细节知识:并发、并行 9.其它细节知识:线程的生命周期 1.多线程概述 线程是什么? 线程(Thread)是一个程序内部的一条执行…...
自定义View中的ListView和ScrollView嵌套的问题
当我们在使用到ScrollView和ListView的时候可能会出现显示不全的问题。那我们可以进行以下分析 ScrollView在测量子布局的时候会用UNSPECIFIED。通过源码观察, 在ScrollView的onMeasure方法中 Overrideprotected void onMeasure(int widthMeasureSpec, int heightMe…...
支持向量机 SVM | 线性可分:硬间隔模型公式推导
目录 一. SVM的优越性二. SVM算法推导小节概念 在开始讲述SVM算法之前,我们先来看一段定义: 支持向量机(Support VecorMachine, SVM)本身是一个二元分类算法,支持线性分类和非线性分类的分类应用,同时通过OvR或者OvO的方式可以应用…...
【Unity实战】UGUI和Z轴排序那点事儿
如果读者是从Unity 4.x时代过来的,可能都用过NGUI这个插件(后来也是土匪成了正规军),NGUI一大特点是可以靠transform位移的Z值进行遮挡排序,然而这个事情在UGUI成了难题(Sorting Layer、Inspector顺序等因素…...
Vue/React 前端高频面试
说一说vue钩子函数 钩子函数是Vue实例创建和销毁过程中自动执行的函数。按照组件生命周期的过程分为:挂载阶段 -> 更新阶段 -> 销毁阶段。 每个阶段对应的钩子函数分别为:挂载阶段(beforeCreate,created,befor…...
[技巧]Arcgis之图斑四至范围批量计算
ArcGIS图层(点、线、面三类图形)四至范围计算 例外一篇介绍:[技巧]Arcgis之图斑四至点批量计算 说明:如下图画出来的框(范围标记不是很准) ,图斑的x最大和x最小,y最大,…...
C/C++工程师面试题(STL篇)
STL 中有哪些常见的容器 STL 中容器分为顺序容器、关联式容器、容器适配器三种类型,三种类型容器特性分别如下: 1. 顺序容器 容器并非排序的,元素的插入位置同元素的值无关,包含 vector、deque、list vector:动态数组…...
Effective Programming 学习笔记
1 基本语句 1.1 断言 在南溪看来,断言可以用来有效地确定编程中当前代码运行的前置条件,尤其是以下情况: 第三方工具库对输入数据的依赖,例如:minitouch库对Android版本的要求...
【MGR】MySQL Group Replication 背景
目录 17.1 Group Replication Background 17.1.1 Replication Technologies 17.1.1.1 Primary-Secondary Replication 17.1.1.2 Group Replication 17.1.2 Group Replication Use Cases 17.1.2.1 Examples of Use Case Scenarios 17.1.3 Group Replication Details 17.1…...
300分钟吃透分布式缓存-17讲:如何理解、选择并使用Redis的核心数据类型?
Redis 数据类型 首先,来看一下 Redis 的核心数据类型。Redis 有 8 种核心数据类型,分别是 : & string 字符串类型; & list 列表类型; & set 集合类型; & sorted set 有序集合类型&…...
思科网络设备监控
思科是 IT 行业的先驱之一,提供从交换机到刀片服务器的各种设备,以满足中小企业和企业的各种 IT 管理需求。管理充满思科的 IT 车间涉及许多管理挑战,例如监控可用性和性能、管理配置更改、存档防火墙日志、排除带宽问题等等,这需…...
深入剖析k8s-控制器思想
引言 本文是《深入剖析Kubernetes》学习笔记——《深入剖析Kubernetes》 正文 控制器都遵循K8s的项目中一个通用的编排模式——控制循环 for {实际状态 : 获取集群中对象X的实际状态期望状态 : 获取集群中对象X的期望状态if 实际状态 期望状态 {// do nothing} else {执行…...
go并发模式之----使用时顺序模式
常见模式之二:使用时顺序模式 定义 顾名思义,起初goroutine不管是怎么个先后顺序,等到要使用的时候,需要按照一定的顺序来,也被称为未来使用模式 使用场景 每个goroutine函数都比较独立,不可通过参数循环…...
[动态规划]---part1
前言 作者:小蜗牛向前冲 专栏:小蜗牛算法之路 专栏介绍:"蜗牛之道,攀登大厂高峰,让我们携手学习算法。在这个专栏中,将涵盖动态规划、贪心算法、回溯等高阶技巧,不定期为你奉上基础数据结构…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
