当前位置: 首页 > news >正文

前端跨域概念及解决方法

文章目录

  • 前端跨域概念及解决方法
    • 什么是跨域
    • 跨域的解决方法
      • JSONP跨域
      • CORS
        • 简单请求 非简单请求
      • Nginx反向代理

前端跨域概念及解决方法

什么是跨域

同源指:两个页面域名、协议、端口均相同。
同源策略是浏览器的一个安全限制,跨域是由浏览器的同源策略造成的,是指浏览器不能执行非同源网站的脚本。
同源策略限制了以下行为:

  1. Cookie、LocalStorage、和 IndexDB 无法读取。
  2. DOM 和 JS 对象无法获取。
  3. 请求(XHR、fetch 等)发不出去。

跨域的解决方法

JSONP跨域

JSONP: json with padding,意味着在 JSON 数据外面包裹了一层填充 Padding,即一个函数调用。

解决思路——避免非同源限制。
JSONP 的原理是利用 script 标签没有跨域限制,通过 script 标签的 src 属性设置跨域 URL,并在 URL 中指定一个回调函数名。服务端接到 JSONP 请求后,将数据包装在回调函数中,返回给浏览器。浏览器接收到响应后用回调函数来处理返回的数据。
举例,假设客户端请求一个跨域的 JSONP 数据,URL 是 http://example.com/data?callback=handleData。服务器端收到请求后,返回的响应是 handleData({ “name”: “John”, “age”: 30 })。这里的 handleData 就是客户端指定的回调函数,而 ({ “name”: “John”, “age”: 30 }) 就是 JSON 数据。整个响应就是 JSON 数据外面包裹了一层填充(padding),也就是一个函数调用。

缺陷是只能实现get请求。

代码:

<script>function f(data){ // 注册f函数alert(data)}
</script>
<script src="http://localhost:91?callback=f"></script> // 返回f('你好'),会立刻执行代码,就走到f函数中了。

服务端

var express = require('express');
var app = express();
app.get("/", function(req, res){var funcname = req.query.callback;res.send(funcname + "('你好')")           // f('你好')
})

CORS

CORS: Cross-Origin Resource Sharing,跨域资源共享跨域资源共享。

解决思路——跨域资源共享方案。
CORS 是一个 W3C 标准,它允许浏览器向跨源服务器发出请求,从而克服了前端请求只能同源的限制。
CORS 需要浏览器和服务器同时支持。但是主要是服务器实现 CORS 接口就可以跨域通信,因为浏览器端发现请求跨域的时候会自动添加一些附加头信息,一般无需手动设置。

简单请求 非简单请求

CORS 将请求分为两类:简单请求和非简单请求。对于能对服务器产生副作用的 HTTP 非简单请求,浏览器必须先发送一个方法为 OPTIONS 的预检请求来获取服务器是否允许该请求跨域。服务器得到确认之后,才发起真正的HTTP请求。在预检请求中,服务端也可以通知客户端是否要携带Credentials.

简单请求同时满足

  • 请求方法是 GET / HEAD / POST
  • 除了浏览器自动设置的头,只能设置 Fetch 规范允许设置的“CORS安全请求头”
    Accept、Accept-Language、Content-Language、Content-Type(需要注意额外的限制)、DPR 、Downlink、Save-Data、Viewport-Width、width
  • 对于 Content-Type 的值只限于下面几个(注意没有application/json,现在post的请求经常使用这个,所以当发post请求的时候会触发预检请求不要意外)
    application/x-www-form-urlencoded、multipart/form-data、text/plain

对于简单请求,CORS 的策略是请求时在请求头中增加一个 Origin 字段,表示请求发出的域。服务器收到请求后,根据该字段判断是否允许该请求访问。
对于响应头,如果允许,则在 HTTP 头信息中添加 Access-Control-Allow-Origin 字段,并返回正确的结果。如果不允许则不添加该字段。

对于非简单请求,
比如请求方法是 PUT 或 DELETE,或者是发送 json 格式的请求。
对于非简单请求的跨源请求,浏览器会在真实请求发出前,增加一次 OPTIONS 请求,称为预检请求(preflightrequest)。预检请求将真实请求的信息,包括请求方法、自定义头字段、源信息添加到 HTTP 头信息字段中,询问服务器是否允许这样的操作。
服务器收到请求时,需要分别对各字段进行验证,验证通过后,会在返回 HTTP 头信息中添加:允许的域、方法、字段、有效期等信息。
当预检请求通过后,浏览器才会发送真实请求到服务器。

对于跨域(发生CORS)的请求默认是不会带上凭证信息(credentials)的,如果要发送凭证信息(credentials)就需要设置对应的标识位。
请求:

  • 请求中要设置withCredentials为true。

响应:

  • Access-Control-Allow-Credentials: true
  • Access-Control-Allow-Origin的值不再是通配符*,应该是单一的origin。

代码:
nodejs

var express = require('express');
var app = express();
//修改响应头
app.get("/",function(req, res){res.header("Access-Control-Allow-Origin","*");res.send("你好")
})// 借助cors模块来解决这个问题
var cors = require('cors');
app.use(cors({origin: ['http://localhost:8083'],methods: ['GET', 'POST'],allowHeaders: ['Conten-Type', 'Authorization']
}));

Nginx反向代理

解决思路——隐蔽跨域
使用Nginx反向代理,在a域名的请求里使用反向代理指向b域名,让浏览器以为一直在访问a网站,不触发跨域限制。

参考:
https://juejin.cn/post/6844903746837889032
https://www.cnblogs.com/n031/p/11828797.html
https://juejin.cn/post/6844903521163182088
https://www.imooc.com/article/291931

相关文章:

前端跨域概念及解决方法

文章目录 前端跨域概念及解决方法什么是跨域跨域的解决方法JSONP跨域CORS简单请求 非简单请求 Nginx反向代理 前端跨域概念及解决方法 什么是跨域 同源指&#xff1a;两个页面域名、协议、端口均相同。 同源策略是浏览器的一个安全限制&#xff0c;跨域是由浏览器的同源策略造…...

Redis中的事务机制

Redis中的事务机制 概述。 事务表示一组动作&#xff0c;要么全部执行&#xff0c;要么全部不执行。例子如下。 Redis提供了简单的事务功能&#xff0c;讲一组需要一起执行的命令放到multi和exec两个命令之间。multi命令代表事务开始&#xff0c;exec命令代表事务结束&#x…...

从零到一构建短链接系统(八)

1.git上传远程仓库&#xff08;现在才想起来&#xff09; git init git add . git commit -m "first commit" git remote add origin OLiyscxm/shortlink git push -u origin "master" 2.开发全局异常拦截器之后就可以简化UserController 拦截器可以…...

缺省和重载。引用——初识c++

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 C输入&输出cout 和cin<<>> 缺省参数全缺省半缺省应用场景声明和定义分离的情况 函数重载1.参数的类型不同2.参数的个数不同3.参数的顺…...

java常用IO流功能——字符流和缓冲流概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup! 之前说了下了IO流的概念&#xff0c;并整理了字节流&#xff0c;有需要的可以看这篇 java常用应用程序编程接口&#xff08;API&#xff09;——IO流概述及字节流的使用 字符流 FileReader(文件字…...

Python中模块的定义、用法

在Python中&#xff0c;模块是一个包含了Python代码的文件。模块可以包含变量定义、函数、类等&#xff0c;并且可以在其他Python脚本中被导入和使用。模块的定义和用法如下所示&#xff1a; 模块的定义&#xff1a; 创建模块文件&#xff1a;在Python中&#xff0c;一个模块就…...

【vscode 常用扩展插件】

vscode 常用扩展插件 常用插件部分插件使用技巧1、eslint 保存自动格式化2、代码片段的使用3、最后是关于引入文件路径提示的 常用插件 记录vscode方便开发的扩展插件&#xff0c;方便换电脑时&#xff0c;快速部署所需环境。 部分插件 1、Auto Close Tag html自动闭合标签插…...

Retelling|Facebook2

录音 Facebook 2 Retelling|Facebook2 复述转写 Hi, Im Helen Campbell, from DJ interpretation, European Commission, Im going to talk about Facebook. You Im sure that you are more familiar with Facebook, a lot, a lot more familiar than I than me. But Ive read…...

读3dsr代码①测试

前置任务 首先是作者不公开checkpoints&#xff0c;需要自己训练一遍 这里先不载入模型单纯过一遍流程 而且因为没有说明是否需要去背景&#xff08;之后再过一下论文&#xff09;&#xff0c;所以反正先用去过背景的数据debug一下 3DSR/geo_utils.py:61: RuntimeWarning: inv…...

Vant Weapp小程序 van-uploader 文件上传点击无反应,删除无反应

Vant Weapp 1.0 版本开始支持van-uploader组件&#xff0c;请先确认好版本号和引用路径正确&#xff01;&#xff01; <van-uploader file-list"{{ fileList }}" deletable"{{ true }}" />1. 上传无反应 微信小程序用了van-uploader&#xff0c;但是…...

【力扣】55.跳跃游戏、45.跳跃游戏Ⅱ

55.跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&a…...

038—pandas 重采样线性插补

前言 在数据处理时&#xff0c;由于采集数据量有限&#xff0c;或者采集数据粒度过小&#xff0c;经常需要对数据重采样。在本例中&#xff0c;我们将实现一个类型超分辨率的操作。 思路&#xff1a; 首先将原始数据长度扩展为 3 倍&#xff0c;可以使用 loc[] 方法对索引扩…...

智慧工地源码 数字孪生可视化大屏 工地管理平台系统源码 多端展示(PC端、手机端、平板端)

智慧工地源码 数字孪生可视化大屏 工地管理平台系统源码 多端展示&#xff08;PC端、手机端、平板端&#xff09; 智慧工地系统多端展示&#xff08;PC端、手机端、平板端&#xff09;;数字孪生可视化大屏&#xff0c;一张图掌握项目整体情况;使用轻量化模型&#xff0c;部署三…...

深度学习Top10算法之深度神经网络DNN

深度神经网络&#xff08;Deep Neural Networks&#xff0c;DNN&#xff09;是人工神经网络&#xff08;Artificial Neural Networks&#xff0c;ANN&#xff09;的一种扩展。它们通过模仿人脑的工作原理来处理数据和创建模式&#xff0c;广泛应用于图像识别、语音识别、自然语…...

【智能算法】海马优化算法(SHO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;Zhao等人受到海马自然社会行为启发&#xff0c;提出了海马优化算法&#xff08;Sea-horse Optimizer, SHO&#xff09;。 2.算法原理 2.1算法思想 SHO模拟了海马群在自然界中的…...

AI大模型学习的伦理与社会影响

AI大模型学习 随着人工智能技术的快速发展&#xff0c;AI大模型学习成为当前热门研究领域之一。AI大模型学习是指基于大规模数据集和深度学习模型进行训练&#xff0c;以实现更高的准确性和复杂性。这些大模型已经在几乎所有领域都取得了显著的成就&#xff0c;包括自然语言处…...

记录些LangChain相关的知识

RAG的输出准确率 RAG的输出准确率 向量信息保留率 * 语义搜索准确率 * LLM准确率RAG的输出准确率由三个因素共同决定&#xff1a;向量信息保留率、语义搜索准确率以及LLM准确率。这三个因素是依次作用的&#xff0c;因此准确率实际上是它们的乘积。这意味着&#xff0c;任何一…...

C语言例4-7:格式字符f的使用例子

%f&#xff0c;实型&#xff0c;小数部分为6位 代码如下&#xff1a; //格式字符f的使用例子 #include<stdio.h> int main(void) {float f 123.456;double d1, d2;d11111111111111.111111111;d22222222222222.222222222;printf("%f,%12f,%12.2f,%-12.2f,%.2f\n&qu…...

[蓝桥杯 2019 省 A] 修改数组

题目链接 [蓝桥杯 2019 省 A] 修改数组 题目描述 给定一个长度为 N N N 的数组 A [ A 1 , A 2 , A 3 , . . . , A N ] A [A_1, A_2, A_3, ...,A_N] A[A1​,A2​,A3​,...,AN​]&#xff0c;数组中有可能有重复出现的整数。 现在小明要按以下方法将其修改为没有重复整数的…...

Git基础(25):Cherry Pick合并指定commit id的提交

文章目录 前言指定commit id合并使用TortoiseGit执行cherry-pick命令 前言 开发中&#xff0c;我们会存在多个分支开发的情况&#xff0c;比如dev&#xff0c;test, prod分支&#xff0c;dev分支在开发新功能&#xff0c;prod作为生产分支已发布。如果某个时候&#xff0c;我们…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...