关于CORS的笔记

CORS目录

  • 一、SpringBoot 跨域设置
  • 二、CORS
    • (1)总结的图如下
    • (2)简单请求满足的条件
    • (3)响应头
    • (4)请求头
    • (5)使用XMLHttpRequest进行跨域访问
      • 1. Access-Control-Allow-Methods
      • 2. Access-Control-Allow-Headers
          • 3. 总结
  • 三、跨域的情况
  • 四、参考

一、SpringBoot 跨域设置

方便拿来用的同学使用,详细的请往下看。

@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {CorsConfiguration htmlGet = new CorsConfiguration();htmlGet.addAllowedOrigin("*");htmlGet.setAllowCredentials(true);htmlGet.addAllowedMethod("*");htmlGet.addAllowedHeader("*");htmlGet.addExposedHeader("*");UrlBasedCorsConfigurationSource corsConfigurationSource= new UrlBasedCorsConfigurationSource();corsConfigurationSource.registerCorsConfiguration("/**", htmlGet);return new CorsFilter(corsConfigurationSource);}
}

二、CORS

跨域访问资源其实就是浏览器通过自身的权限,控制HTTP请求访问服务器资源,服务器和浏览器是基于HTTP请求头进行交流,例如:服务器通过Access-Control-Allow-Origin、Access-Control-Allow-Methods等类似的请求头告诉浏览器,我这个资源只能特定的源、某一组method才能进行访问。总结来说:服务器基于HTTP头声明哪些源通过浏览器的权限能访问服务器的哪些资源。

(1)总结的图如下

CORS权限验证的流程有两种,分别是简单请求和预检。

  1. 简单请求可以直接发起请求。
  2. 不是简单请求则需要预检,预检没问题之后才会发起真正的请求。

在这里插入图片描述

(2)简单请求满足的条件

  • 使用下列方法之一:
    • GET
    • HEAD
    • POST
  • 除了被用户代理自动设置的标头字段(例如 ConnectionUser-Agent 或其他在 Fetch 规范中定义为禁用标头名称的标头),允许人为设置的字段为 Fetch 规范定义的对 CORS 安全的标头字段集合。该集合为:
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type(需要注意额外的限制)
    • Range(只允许简单的范围标头值 如 bytes=256-bytes=127-255
  • Content-Type 标头所指定的媒体类型的值仅限于下列三者之一:
    • text/plain
    • multipart/form-data
    • application/x-www-form-urlencoded
  • 如果请求是使用 XMLHttpRequest 对象发出的,在返回的 XMLHttpRequest.upload 对象属性上没有注册任何事件监听器;也就是说,给定一个 XMLHttpRequest 实例 xhr,没有调用 xhr.upload.addEventListener(),以监听该上传请求。
  • 请求中没有使用 ReadableStream 对象。

(3)响应头

  • Access-Control-Allow-Origin

告诉浏览器允许访问的源。

  • Access-Control-Expose-Headers

XMLHttpRequest.getResponseHeader可以访问的请求头,如果不设置只能访问Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。

  • Access-Control-Max-Age
  • Access-Control-Allow-Credentials
  • Access-Control-Allow-Methods
  • Access-Control-Allow-Headers

(4)请求头

这些请求头都是浏览器自己设置的,不能通过正常的API更改。

  • Origin
  • Access-Control-Request-Method
  • Access-Control-Request-Header

(5)使用XMLHttpRequest进行跨域访问

API

@RequestMapping("/cors")
@RestController
public class CorsController {@GetMapping(value = "/html")public String html(HttpServletResponse response) {return "<div>GET</div>";}@DeleteMapping(value = "/delete")public String delete(HttpServletResponse response) {return "<div>DELETE</div>";}
}

1. Access-Control-Allow-Methods

function get() {const xhr = new XMLHttpRequest();xhr.open('GET', 'http://localhost:8080/cors/html')xhr.onreadystatechange = function() {console.log('status', xhr.readyState)}xhr.send();
}
@Bean
public CorsFilter corsFilter() {CorsConfiguration htmlGet = new CorsConfiguration();htmlGet.addAllowedOrigin("null");htmlGet.addAllowedMethod("DELETE");UrlBasedCorsConfigurationSource corsConfigurationSource= new UrlBasedCorsConfigurationSource();corsConfigurationSource.registerCorsConfiguration("/cors/html", htmlGet);return new CorsFilter(corsConfigurationSource);
}

可以看到CORS异常了,XMLHTTPRequest请求是GET,服务器Access-Control-Allow-Methods是DELETE,换成人话说:服务器只允许DELETE请求。

在这里插入图片描述

htmlGet.addAllowedMethod("DELETE"); 改成htmlGet.addAllowedMethod("GET");

在这里插入图片描述

2. Access-Control-Allow-Headers

function get() {const xhr = new XMLHttpRequest();xhr.open('GET', 'http://localhost:8080/cors/html')xhr.onreadystatechange = function() {console.log('status', xhr.readyState)}xhr.setRequestHeader('headxxx', 'a');xhr.send();
}
@Bean
public CorsFilter corsFilter() {CorsConfiguration htmlGet = new CorsConfiguration();htmlGet.addAllowedOrigin("null");htmlGet.addAllowedMethod("DELETE");htmlGet.addAllowedHeader("Token");UrlBasedCorsConfigurationSource corsConfigurationSource= new UrlBasedCorsConfigurationSource();corsConfigurationSource.registerCorsConfiguration("/cors/html", htmlGet);return new CorsFilter(corsConfigurationSource);
}

因为我们的请求头headxxx不在简单请求的范围内(上面写了),所以浏览器发起了预检。服务器只接收Token请求头,所以浏览器通过对比后发现http请求不满足服务器的规则。不是简单请求都会触发预检。
在这里插入图片描述

xhr.setRequestHeader('headxxx', 'a');改成xhr.setRequestHeader('Token', 'a');
在这里插入图片描述

3. 总结

后面的就不去验证了,到这里我们已经知道CORS其实就是浏览器设置的一道权限,服务器可以通过Access-Control-Allow-Methods、Access-Control-Allow-Headers、Access-Control-Allow-Origin等特定的请求头去限制源的访问。

三、跨域的情况

  • XMLHttpRequest 或 Fetch API 发起的跨源 HTTP 请求。
  • Web 字体(CSS 中通过 @font-face 使用跨源字体资源),因此,网站就可以发布 TrueType 字体资源,并只允许已授权网站进行跨站调用。
  • WebGL 贴图。
  • 使用 drawImage() 将图片或视频画面绘制到 canvas。
  • 来自图像的 CSS 图形 (en-US)
  • 四、参考

    跨域资源共享(CORS)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DEVICENET转ETHERNET/IP网关devicenet协议

捷米JM-EIP-DNT&#xff0c;你听说过吗&#xff1f;这是一款自主研发的ETHERNET/IP从站功能的通讯网关&#xff0c;它能够连接DEVICENET总线和ETHERNET/IP网络&#xff0c;从而解决生产管理系统中协议不同造成的数据交换互通问题。 这款产品在工业自动化领域可谓是一大利器&…

springboot()—— swagger

零、一张图读懂swagger 懂了&#xff0c;这玩意就是用swagger搞出来的&#xff01; 就是一个后端开发自测的东西嘛&#xff01; 一、概念 存在即合理&#xff0c;我们看一下swagger诞生的原因&#xff1a;在前后端分离的架构中&#xff0c;前端新增一个字段&#xff0c;后端就…

【FAQ】在Linux中使用curl访问EasyCVR,返回报错Unauthorized的原因排查

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;比如&#xff1a;视…

Vue-函数式组件

最近在开发项目的时候&#xff0c;定制了一个公司内部样式的Modal模态框组件。 Modal组件伪代码 <!-- Modal/index.vue--> <template><div class"modal-container" id"modalContainer"><!-- Modal Content --><div class&quo…

45.ubuntu Linux系统安装教程

目录 一、安装Vmware 二、Linux系统的安装 今天开始了新的学习&#xff0c;Linux,下面是今天学习的内容。 一、安装Vmware 这里是在 Vmware 虚拟机中安装 linux 系统&#xff0c;所以需要先安装 vmware 软件&#xff0c;然 后再安装 Linux 系统。 所需安装文件&#xff1a;…

Java-接口

目录 1.接口的概念 2.语法规则 3.接口使用 4.接口特性 5.实现多个接口 6.接口间的继承 7.接口使用实例 1.接口的概念 电脑的USB口上&#xff0c;可以插&#xff1a;U盘、鼠标、键盘等所有符合USB协议的设备&#xff1b;数据线的type-c口上&#xff0c;可以插手机&#xf…

Spring源码篇(九)自动配置扫描class的原理

文章目录 前言ClassLoader如何加载jar包里的class自动配置扫描class的原理spring中的加载方式源码总结 前言 spring是怎样通过ComponentScan&#xff0c;或者自动配置扫描到了依赖包里class的&#xff1f; ClassLoader 这里涉及到了class Loader的机制&#xff0c;有些复杂&…

Unity Image(RawImage) 实现按轴心放大缩小,序列化存储轴心信息,实现编译器窗口保存轴心

工作时分配给我的要实现的功能&#xff0c;写的时候遇到挺多的坑的&#xff0c;在此记录一下 效果 放大缩小的效果 2.编译器扩展窗口记录 实现点 1.Json序列化存储图片轴心位置, 放大倍率&#xff0c;放大所需要的事件 2.用了编译器扩展工具便于保存轴心信息坑点 1.Imag…

飞桨AI Studio可以玩多模态了?MiniGPT4实战演练!

MiniGPT4是基于GPT3的改进版本&#xff0c;它的参数量比GPT3少了一个数量级&#xff0c;但是在多项自然语言处理任务上的表现却不逊于GPT3。项目作者以MiniGPT4-7B作为实战演练项目。 创作者&#xff1a;衍哲 体验链接&#xff1a; https://aistudio.baidu.com/aistudio/proj…

前端如何打开钉钉(如何唤起注册表中路径与软件路径不关联的软件)

在前端唤起本地应用时&#xff0c;我查询了资料&#xff0c;在注册表中找到腾讯视频会议的注册表情况&#xff0c;如下&#xff1a; 在前端代码中加入 window.location.href"wemeet:"; 就可以直接唤起腾讯视频会议&#xff0c;但是我无法唤起钉钉 之所以会这样&…

leetcode每日一题Day2——344. 反转字符串

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; …

【css】css实现一个简单的按钮

四种链接状态分别是&#xff1a; a:link - 正常的&#xff0c;未访问的链接a:visited - 用户访问过的链接a:hover - 用户将鼠标悬停在链接上时a:active - 链接被点击时 <style> a:link, a:visited {//未访问、访问过background-color: #07c160;//设置背景颜色color: wh…

【ASP.NET MVC】使用动软(五)(13)

一、问题 前文完成的用户登录后的首页如下&#xff1a; 后续账单管理、人员管理等功能页面都有相同的头部&#xff0c;左边和下边&#xff0c;唯一不同的右边内容部分&#xff0c;所以要解决重复设计的问题。 二、解决方法——使用布局页 在Views上右键添加新建项&#xff…

基于量子同态加密的改进多方量子私有比较

摘要量子同态加密在隐私保护方面具有明显的优势。本文提出了一种改进的基于量子同态加密的多方量子私钥比较协议。首先&#xff0c;引入可信密钥中心&#xff0c;安全辅助加密密钥的分发和解密密钥的更新&#xff0c;同时防止恶意服务器发布虚假结果的攻击;在保证所有参与者得到…

RPC原理与Go RPC详解

文章目录 RPC原理与Go RPC什么是RPC本地调用RPC调用HTTP调用RESTful API net/rpc基础RPC示例基于TCP协议的RPC使用JSON协议的RPCPython调用RPC RPC原理 RPC原理与Go RPC 什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;即远程过程调用。它允许像调用…

Spring Boot 配置多数据源【最简单的方式】

Druid连接池 Spring Boot 配置多数据源【最简单的方式】 文章目录 Druid连接池 Spring Boot 配置多数据源【最简单的方式】 0.前言1.基础介绍2.步骤2.1. 引入依赖2.2. 配置文件2.3. 核心源码Druid数据源创建器Druid配置项 DruidConfig 3.示例项目3.1. pom3.1.1. 依赖版本定义3.…

matlab使用教程(8)—绘制三维曲面图

1网格图和曲面图 MATLAB 在 x-y 平面中的网格上方使用点的 z 坐标来定义曲面图&#xff0c;并使用直线连接相邻的点。mesh 和surf 函数以三维形式显示曲面图。 • mesh 生成仅使用颜色来标记连接定义点的线条的线框曲面图。 • surf 使用颜色显示曲面图的连接线和面。 MATL…

网络安全 Day26-PHP 简单学习

PHP 简单学习 1. 为什么要学习PHP2. PHP语法3. php 变量4. 字符串数据5. PHP 函数6. 数组 1. 为什么要学习PHP php存量多开源软件多很多安全流程 渗透方法 sql注入基于PHP语言入门简单 2. PHP语法 格式: <?php 内容?>或<?内容?>结尾分号例子<?php phpin…

深度学习实践——循环神经网络实践

系列实验 深度学习实践——卷积神经网络实践&#xff1a;裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 代码可见于&#xff1a;https://download.csdn.net/download/weixin_51735061/88131380?spm1001.201…

【Linux】进程间通信——管道

目录 写在前面的话 什么是进程间通信 为什么要进行进程间通信 进程间通信的本质理解 进程间通信的方式 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 什么是匿名管道 匿名管道通信的原理 pipe()的使用 匿名管道通信的特点 拓展代码 命名管道 什么是命…