【browser】浏览器跨域处理

news2025/1/22 21:43:27

好久没有更新博客了,前段时间在疯狂面试,最近工作了才有时间来写博客。
准备来讲讲面试里常问到的跨域处理吧。
说到跨域,我们可能会下意思的说出jsonp,服务端配置cors,node配置代理等,再多了,我可能想不起来了。本篇本来打算只记录postMessage这种方式的,但光说这个显得太单薄了,所以一并都总结一下吧。

跨域是什么,为什么会跨域?
要想知道为什么,你得先知道什么是同源策略。同源策略是浏览器的一个安全协议(否则都乱套了,大家都能随意访问对方的数据,都在裸奔,也就没有隐私而言了),它限制了只有在同源的情况下才可以安全访问请求到数据,同源即同一个协议、域名、端口即是同源,比如:

http://localhost:8000

这里http就是协议
localhost是域名
而8000就是端口
协议域名端口哪怕有一个不同,都会造成跨域导致无法正常去请求。但我们在日常开发的时候,早已经前后端分离了,所以在联调接口的时候,就会有各种跨域问题。

JSONP

在那个用jq刀耕火种的那个年代,jq就基于xmlHttprequest封装了ajax请求库,在请求配置项里可以直接配置jsonp:true来做跨域请求。原理是利用script标签加载不受跨域的影响,将请求放到script标签的src属性上。同时声明一个回调函数用于接收数据,在请求后面加上这个回调函数,服务端接收到请求后把参数放到回调函数里,本次http连接结束后会自动执行这个回调函数。通过这种方式,我们实现了跨域请求。
上才艺

function jsonp(src) {
	const script = document.createElement("script");
	script.src = `${src}?callback=onSuccess`;
	document.head.appendChild(script);
	script.onload = () => {
		// 加载成功后自动删除该标签
		document.head.removeChild(script)
	}
}

同时声明一个onSuccess函数用于响应请求接收结果

function onSuccess(res) {
	console.log(res);
}

以上:我们声明了一个jsonp函数用于跨域请求数据,并声明一个onSuccess函数用于接收请求数据;
服务端响应(这里以node为例)
随便拉个脚手架搭个node服务,创建一个路由用于测试jsonp跨域请求。

search.get('/test', async ctx => {
  const cb = ctx.query.callback;
  const result = {
    code: 0,
    data: {
      name: 'xxxxxx',
      token: 'xxxxxxxxxxxxxxx'
    }
  }
  ctx.body = `${cb}(${JSON.stringify(result)})`
})

获取请求里的callback参数,把结果放到这个callback方法里;
前端触发jsonp这个方法去请求/search/test 看看结果
在这里插入图片描述
可以看到已经可以成功请求到数据了。至此,通过jsonp方法来跨域我们已经了解了。但是一定要知道这种方式的弊端,为何我们现在都不用Jsonp来做跨域请求了呢?
jsonp它只支持get请求,因为浏览器加载script脚本是通过get方式来请求的,所以没法用post请求了。众所周知的是get和post的区别里 有一条特别重要的是get会直接把请求参数拼接到连接上,相对post来说这是不够安全的。

CORS

服务端通过配置请求头,允许所有的跨域请求;
这里还是以node服务为例,比如Koa库,我们建一个中间件用于处理跨域请求;

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');
  if (ctx.method == 'OPTIONS') {
    ctx.body = 200; 
  } else {
    await next();
  }
});

在koa实例里use这个middleware
这里主要是配置了Access-Control-Allow-Origin 允许了所有请求都能访问;
关于Access-Control-Allow-Origin的解释看mdn

node代理

明天再更其他的吧
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/468690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

加密脱胎于去中心化理想,但力求合规 细数各国政府态度之演变

比特币诞生之始,只是极客文化圈内流行的小众货币。如今,加密市场已经发展到无法忽视的程度,虽然全球仍未对加密货币形成共识,但监管已成为各国政府不得不考虑的问题。 美国:监管愈发模糊且不可测 美国始终是加密领域全…

八股文(Mybatis)

文章目录 1. Mybatis缓存机制2. 动态SQL语句3. 分页3. 1 几种分页方式3.2 MyBatis 是如何进行分页的?分页插件的原理是什么?3.3 逻辑分页和物理分页 1. Mybatis缓存机制 作用:避免每次都去查db 一级缓存是SqlSession级别的缓存,也…

Mysql统计分组后每组数据与每组数量区别

下边统计的是分组后每组的数量:结果是多个 select p.id (count(*)) from p group by p.id 如果想统计分组后,有多个分组,需要如下执行: select count(*) from (select p.id (count(*)) from p group by p.id) as a 此外&#xf…

大数据之Hadoop数据仓库Hive

目录: 一、简介二、HQL的执行流程三、索引四、索引案例五、Hive常用DDL操作六、Hive 常用DML操作七、查询结果插入到表八、更新和删除操作待完善。。。 一、简介 Hive 是一个构建在 Hadoop 之上的数据仓库,它可以将结构化的数据文件映射成表&#xff0c…

【Linux】线程-线程安全之互斥

操作系统核心数centos 3.10.032位单核 线程之线程安全 线程不安全的现象互斥死锁线程饥饿 线程不安全的现象 进程线程的背景概念: 临界资源:多线程执行流之间共享的资源 临界区:每个线程内部,访问临界资源的代码 互斥&#xff1a…

设计模式——责任链

目录 1、传统方案,OA系统的采购审批项目 2、职责链模式基本介绍 3、职责链模式解决 OA 系统采购审批项目 4、职责链模式在 SpringMVC 框架应用的源码分析 责任链模式类似一个链表,每个具体处理人层层判断对请求的处理权限,没权限的话把请…

基于C++/CLI实现C#调用C++类对象过程中的注意事项

目录 一、基于C/CLI 的调用原理二、注意事项如何基于VS2010完成上述一系列开发过程1、生成C应用程序(非托管代码)2、基于C/CLI生成托管代码3、C#调用 三、C/CLI与COM组件对比 一、基于C/CLI 的调用原理 C/CLI (Common Language Infrastructu…

阿里P7晒出工资单:狠补了这个,真香...

据阿里HR部门发布的最新信息,2023年招聘岗位数将扩招3000+。但就2022年就业形势来看,大厂缩招裁员导致优质岗位竞争变得更加激烈,2023开年以来,也有不少大厂纷纷传来裁员的消息!除了对面试者技术的要求变高…

Netty BIO/NIO/AIO介绍

概念介绍 1、 BIO(blocking I/O):同步阻塞IO,也即是传统的I/O。 2、 NIO (non-blocking IO): 也即是New I/O,使用它可以提供非阻塞式的高伸缩性网络。 3、AIO 即 NIO2.0, 叫做异步不阻塞的 IO。 AIO 引入异步通道的概念, 采用了 Proactor 模式, 简化了程序编写,有…

零拷贝(Zero-Copy)

一,数据的四次拷贝与四次上下文切换 很多应用程序在面临客户端请求时,可以等价为进行如下的系统调用: File.read(file, buf, len);Socket.send(socket, buf, len); 例如消息中间件 Kafka 就是这个应用场景,从磁盘中读取一批消息…

kafka介绍

1.kafka是什么 Kafka是一种高性能、可扩展、容错的分布式流处理平台,广泛应用于日志收集、实时数据处理、消息传递等场景所开发的一个消息队列中间件 2.kafka的优势 Kafka的优势在于其高吞吐量、可扩展性、容错性以及灵活的数据保留策略。它的高吞吐量是因为Kafk…

十一、Node.js

一、Node.js是什么? 在了解Node.js之前,我们先去了解一下什么叫v8引擎。这里参考一下其他博主的资料。 聊聊V8引擎_努力学习前端的77的博客-CSDN博客 这个时候我们再去看下Node.js的定义。 官方对Node.js的定义: Node.js是一个基于V8 Ja…

mysql优化-减少查询回表次数和回表数据量

减少数据回表常见的三种方式分别是1)查询条件使用聚集索引;2)使用索引下推;3)使用索引覆盖。 1 查询条件使用聚集索引-避免回表查询 按照索引使用数据结构B树叶子结点是否包含表中全部字段,mysql 索引可以…

“数字中国·福启海丝”多屏互动光影艺术秀27日在福州举办

作为深化“数字海丝”的核心区、海上丝绸之路的枢纽城市,为喜迎第六届数字中国建设峰会盛大召开之际,福州市人民政府特此举办“数字中国福启海丝”多屏互动光影秀活动。本次光影秀活动是由福建省文化和旅游厅指导,福州市人民政府主办&#xf…

USB转串口芯片CH9101U

CH9101是一个USB总线的转接芯片,实现USB转异步串口。提供了常用的MODEM联络信号,用于为计算机扩展异步串口,或者将普通的串口设备或者MCU直接升级到USB总线。 特点 全速USB设备接口,兼容USB V2.0。内置固件,仿真标准串…

CH9121网络串口透传应用

概述 随着物联网技术的普及,越来越多的传统设备出现联网功能需求。串口作为使用较为广泛的一种通信接口,串口转以太网,进行远程数据传输需求逐渐显现出来。CH9121内部集成TCP/IP协议栈,无需编程,即可轻松实现网络数据…

撰写项目文档: 节省时间的技巧和模板

高质量的项目文档具有长期价值。它不仅有助于确保项目的成功,而且还可以作为未来项目和计划的参考! 项目文档是任何项目的脉搏,它连接了成功运行项目所需的一切。 文档必须足够宽泛,以便开发能够取得进展。但要足够灵活&#xf…

DAB-Deformable-DETR源码学习记录之模型构建(二)

书接上回,上篇博客中我们学习到了Encoder模块,接下来我们来学习Decoder模块其代码是如何实现的。 其实Deformable-DETR最大的创新在于其提出了可变形注意力模型以及多尺度融合模块: 其主要表现在Backbone模块以及self-attention核cross-atten…

平台+AI:全面拥抱大模型的商业创新,打造企业数字化「柔性供应链」 | D3演讲实录

马斯克曾说:“高生产率解决诸多问题。” 在社会化内卷的大环境下,借助数智化“降本增效”已是不争事实。AI技术日新月异、大量信息繁杂涌现,无数原来烟囱式的模式亟需变革,平台与AI之间怎样融合,才能发挥更大的功效&a…

深度学习量化总结(PTQ、QAT)

背景 目前神经网络在许多前沿领域的应用取得了较大进展,但经常会带来很高的计算成本,对内存带宽和算力要求高。另外降低神经网络的功率和时延在现代网络集成到边缘设备时也极其关键,在这些场景中模型推理具有严格的功率和计算要求。神经网络…