同源策略和跨域问题的解决

news2024/11/20 1:42:25

跨域问题

跨域问题顾名思义是当浏览器对不同于当前域的一个域下的资源进行访问和操作而产生的一系列**问题。**这些限制问题的产生是因为浏览器出于安全考虑对同源请求放行,对异源请求限制的一种规则,这种规则就是同源策略,因此限制造成的开发问题称之为跨域(异源)问题。

同源策略

何为同源

源 = 协议 + 域名 + 端口

只要“协议 + 域名 + 端口” 不完全相同,就算是不同源。因为这个组合为每个站点提供了唯一的标识符。

这里使用MDN官网给出的示例来简单说明什么是同源。下标均与http://store.company.com/dir/page.html的源进行对比分析。

URL结果原因
http://store.company.com/dir2/other.html同源只有文件路径不同
http://store.company.com/dir/inner/another.html同源只有路径不同
https://store.company.com/secure.html不同源协议不同
http://store.company.com:81/dir/etc.html不同源端口号不同(http:// 默认端口号是80)
http://news.company.com/dir/other.html不同源域名(主机)不同

浏览器访问一个html页面这个页面是一个页面源,但是这个html中可能包含<img/><link>AJAX<audio><form>等,这些都需要我们前往目标源请求资源,一旦目标源域页面源不是处于同源下即协议、域名、端口三者有一个不同就是跨域。

对于出现跨域的这些请求浏览器对他们的限制也是不同的,对标签发出的跨域请求轻微限制、对AJAX发出的跨域请求严厉限制

这里我们简单讲解浏览器对AJAX的限制:

在这里插入图片描述

解决跨域问题 | CORS

定义

CORS全称:Cross-Origin-Resource Sharing(跨域资源共享),顾名思义请求可以通过使用CORS来允许跨源访问。CORSHTTP的一部分,它允许服务端来指定哪些主机可以从这个服务端加载资源。

基本理念

CORS是一套机制,用于浏览器的校验跨域请求(它主要靠服务器解决)

它的基本理念是:

  1. 只要服务器明确标识允许,则校验通过
  2. 服务器明确表示拒绝或者没有表示,则校验不通过

CORS把请求分为两类

简单请求
  • 请求方法:GETHEADPOST

  • 请求头部字段满足CORS安全规范(只要不人为修改请求的头部就是简单请求)

  • 请求头的Content-Type

    • text/plain
    • multipart/form-data
    • application/x-www-form-urlencoded

    简单请求处理利用CORS处理跨域的方式就是给响应体头部的Access-Control-Allow-Origin:(填写允许访问的页面源地址或者*允许所有);

在这里插入图片描述

预检请求

预检请求(preflight ),通常preflight预检请求,指的就是OPTIONS请求。

它会在浏览器认为即将要执行的请求可能会对服务器造成不可预知的影响时,由浏览器自动发出。通过预检请求,浏览器能够知道当前的服务器是否允许执行即将要进行的请求,只有获得了允许,浏览器才会真正执行接下来的请求。

通常preflight请求不需要用户自己去管理和干预,它的发出的响应都是由浏览器和服务器自动管理的。

预检请求头部

Access-Control-Request-Headers: x-requested-with
Access-Control-Request-Method: POST
Origin: http://test.preflight.qq.com

这三个字段,依次代表访问来源、真实请求的方法和真实请求的请求头。

响应体头部

Access-Control-Allow-Headers: Content-Type, Content-Length, Authorization, Accept, X-Requested-With
Access-Control-Allow-Origin: http://test.preflight.qq.com
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 86400 //这个表示在86400ms这段时间内Access-Control-Allow-Origin的页面源都可以向服务器请求资源。预检请求的有效期

响应里我们需要关心的是Access-Control-Allow-Origin Access-Control-Allow-Headers Access-Control-Allow-Methods 这三个字段,依次代表当前请求支持的访问域、支持的自定义请求头、支持的请求方法,如果即将执行的请求的任意一项不在支持范围内,浏览器就会自动放弃执行真实请求。同时抛出CORS错误。

注意如果按照CORS规则要求如果不符合简单请求的规范就会发起预检请求。

总结来说就是,跨域不一定会触发preflight预检请求,发生preflight预检请求一定跨域了。

解决跨域问题 | JSONP

JSONP是解决跨域问题的古老方案。同源策略中,对标签的跨域请求限制较小。JSONP利用了这一点。

浏览器html页面源通过<script src="跨域地址">发起请求

在这里插入图片描述

function callback(resp) {
	console.log(resp);
}
function request(url) {
    //创建一个script标签
	const script = document.creatElement('script');
    //设置script标签的src属性
    script.src = url;
    // script标签的onload事件都是在外部js文件被加载完成并执行完成后才被触发的。(也就是请求url获得的js脚本被执行完毕)
    script.onload = function() {
        //卸载标签
		script.remove();
    }
    // 添加元素到dom树
    document.body.appendChild(script);
}
document.quertSelector('button').onclick(){
	request('http://my.com/api?callback')
}

在这里插入图片描述

这里主要通过<script src="跨域地址?callback">传一个前端自定义的一个callback回调函数给服务器,由服务器传入callback函数参数并执行,然后将执行结果返回给浏览器。

注意这里的请求已经不是AJAX了,所以浏览器没有对跨域进行严格检验。

解决跨域问题 | 代理

代理服务器的使用主要是利用跨域问题在浏览器上发生这一特点,通过代理服务器代理发送请求给目标服务器。

再由代理服务器将得到的数据返回给浏览器,这样做的好处是代理服务器是我们可以操控的,比如我们可以在代理服务器上利用CORS或者JSONP解决跨域,而目标服务器我们无法操作。

在这里插入图片描述

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

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

相关文章

【AI视野·今日NLP 自然语言处理论文速览 第三十八期】Thu, 21 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 21 Sep 2023 Totally 57 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Chain-of-Verification Reduces Hallucination in Large Language Models Authors Shehzaad Dhuliawala, Mojt…

基于springboot+vue的信息技术知识赛系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

计算机视觉与深度学习-循环神经网络与注意力机制-Attention(注意力机制)-【北邮鲁鹏】

目录 引出Attention定义Attention-based model通俗解释应用在图像领域图像字幕生成&#xff08;image caption generation&#xff09;视频处理 序列到序列学习&#xff1a;输入和输出都是长度不同的序列 引出Attention 传统的机器翻译是&#xff0c;将“机器学习”四个字都学…

Linux三大搜索指令的区别

find&#xff1a;可以在指定的路径下进行文件的搜索 —— 真的在磁盘文件中查找 例如find /usr/bin/ -name ls which 可以在指令路径下&#xff0c;/usr/bin,搜索指令文件 例如&#xff1a;which ls whereis:在系统特定的路径下查找&#xff0c;既可以找到可执行程序&#xff…

您的计算机已被.360勒索病毒感染?恢复您的数据的方法在这里!

导言&#xff1a; 在数字时代&#xff0c;威胁网络安全的恶意软件不断演化&#xff0c;而.360勒索病毒则是近年来备受关注的一种。这种勒索病毒以其高度复杂的加密技术和毒害性的行为而著称&#xff0c;威胁着用户的数据和隐私。本文91数据恢复将深入剖析.360勒索病毒&#xf…

三叠云电梯维保系统,全面提升电梯维保管理效率与质量

随着城市化进程的不断加速&#xff0c;电梯已成为现代建筑中不可或缺的交通工具。然而&#xff0c;电梯的安全和正常运行对于居民和物业公司来说至关重要&#xff0c;同时电梯维保一直是一个困扰物业管理公司和维保企业的难题。传统的维保方式因纸质记录的繁琐和错误频发&#…

【ArcGIS】土地利用变化分析详解(矢量篇)

土地利用变化分析详解-矢量篇 土地利用类型分类1 统计不同土地利用类型的面积/占比1.1 操作步骤Step1&#xff1a;Step2&#xff1a;计算面积Step3&#xff1a;计算占比 2 统计不同区域各类土地利用类型的面积2.1 操作步骤 3 土地利用变化转移矩阵3.1 研究思路3.2 操作步骤 4 分…

uniapp 运行到ios基座教程

请注意&#xff0c;要在 iOS 真机设备上运行 UniApp 项目&#xff0c;你需要使用有效的开发者证书和配置相关的签名设置。此外&#xff0c;还需要根据你的需求对项目进行调试和适配。 以下是一个基本的运行 UniApp 项目到 iOS 模拟器或设备的步骤。具体操作可能会因你的项目配置…

leetcode1516.移动N叉树的子树

题目 给定一棵没有重复值的 N 叉树的根节点 root ,以及其中的两个节点 p 和 q。 移动节点 p 及其子树,使节点 p 成为节点 q 的直接子节点。 如果 p 已经是 q 的直接子节点,则请勿改动任何节点。 节点 p 必须是节点 q 的子节点列表的最后一项。 返回改动后的树的根节点。 节点…

Python函数绘图与高等代数互融实例(八):箱线图|误差棒图|堆积图

Python函数绘图与高等代数互融实例(一):正弦函数与余弦函数 Python函数绘图与高等代数互融实例(二):闪点函数 Python函数绘图与高等代数互融实例(三):设置X|Y轴|网格线 Python函数绘图与高等代数互融实例(四):设置X|Y轴参考线|参考区域 Python函数绘图与高等代数互融实例(五…

AIX360-CEMExplainer: MNIST Example

CEMExplainer: MNIST Example 这一部分屁话有点多&#xff0c;导包没问题的话可以跳过加载MNIST数据集加载经过训练的MNIST模型加载经过训练的卷积自动编码器模型&#xff08;可选&#xff09;初始化CEM解释程序以解释模型预测解释输入实例获得相关否定&#xff08;Pertinent N…

【计算机网络笔记一】网络体系结构

IP和路由器概念 两台主机如何通信呢&#xff1f; 首先&#xff0c;主机的每个网卡都有一个全球唯一地址&#xff0c;MAC 地址&#xff0c;如 00:10:5A:70:33:61 查看 MAC 地址&#xff1a; windows: ipconfig / alllinux&#xff1a;ifconfig 或者 ip addr 同一个网络的多…

消息队列 记录

https://www.bilibili.com/video/BV1ia411k7oo/?p3&vd_source088e0f60c1207e991fcf231a9f1a0274

【@PostConstruct、 @Autowired与构造函数的执行顺序】

PostConstruct、 Autowired与构造函数的执行顺序 一、PostConstruct介绍二、Spring框架中在bean初始化和销毁时候执行实现方式三、项目验证1.MyServiceImpl2.测试结果3. 项目源码 最近对同事代码进行codeReview时候发现用PostConstruct注解&#xff0c;特地对此注解执行顺序进行…

【计算机基础】VScode基础操作大合集

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

重新认识Java中的死锁问题

一、定义 多个进程因抢夺系统资源而产生相互等待的现象。 二、场景模拟 package com.gui.practise.thread.deadlock;public class DeadLock {private final Object resource1 new Object();//资源 1 private final Object resource2 new Object();//资源 2 public v…

一、8086

1、三大总线&#xff1a; &#xff08;1&#xff09;基础&#xff1a; 地址总线、数据总线、控制总线 &#xff08;2&#xff09;例题&#xff1a; 2、8086CPU &#xff08;1&#xff09;通用寄存器&#xff1a; 数据寄存器&#xff1a; 指针寄存器和变址寄存器&#xff1a…

Goland设置头注释

package ${GO_PACKAGE_NAME} * Author: 坐公交也用券 * HomePage: https://liumou.site * File: ${NAME}.go * Date: ${DATE} ${TIME} * Des: 文件作用

elsarticle class not displaying email addresses

See https://tex.stackexchange.com/questions/84573/elsarticle-class-not-displaying-email-addresses

十一、DS18B20温度传感器

十一、DS18B20温度传感器 介绍单总线模块代码DS18B20模块代码温度读取主函数温度报警器主函数 介绍 单总线时序结构 初始化&#xff1a;主机将总线拉低至少480us&#xff0c;然后释放总线&#xff0c;等待15~ 60us后&#xff0c;存在的从机会拉低总线60~240us以相应主机&#x…