同源策略以及SpringBoot的常见跨域配置

先说明一个坑。在跨域的情况下,浏览器针对复杂请求,会发起预检OPTIONS请求。如果服务端对OPTIONS进行拦截,并返回非200的http状态码。浏览器一律提示为cors error。

一、了解跨域

1.1 同源策略

浏览器的同源策略(Same-Origin Policy),用于限制网页中的JavaScript代码与来自不同源的资源进行交互。

同源策略的规则包括

  1. 协议相同
  2. 域名或主机地址相同
  3. 端口相同

下图为是否同源的示例

1.2 跨域资源共享

1.2.1 概念

跨域资源共享(Cross-Origin Resource Sharing,CORS)是一种机制,为了绕过浏览器的同源策略(Same-Origin Policy)而设计的,它允许网页从不同源(域名、协议、端口)获取或发送HTTP请求,以实现跨域数据交换。

CORS将HTTP请求分为两类,如果详细了解,请查阅跨域资源共享-W3C

  1. 简单请求
    • 请求方式
      • GET
      • POST
      • HEAD
    • 特定的Content-Type值
      • text/plain
      • multipart/form-data
      • application/x-www-form-urlencoded
    • 请求头Accept, Accept-Language, Content-Language
  2. 预检请求
    • 当浏览器检测到一个跨域请求不符合"简单请求"的条件时,它会自动发送一个预检请求以获得服务器的授权。
    • 非简单请求的请求方式
    • 非简单请求的Content-Type值
    • 非简单请求的请求头

1.2.2 服务器

服务器通过在响应中包含相应的CORS头部来授权或拒绝请求。常见的CORS头部包括:

  • Access-Control-Allow-Origin:指定哪些源可以访问资源。
  • Access-Control-Allow-Methods:指定允许的HTTP方法。
  • Access-Control-Allow-Headers:指定允许的自定义HTTP头部。
  • Access-Control-Allow-Credentials:指定是否允许发送凭据,如Cookie。
  • Access-Control-Max-Age:时间单位为秒。指定预检请求的缓存时间,减少后续请求的预检请求次数。

二、SpringBoot示例配置

SpringBoot配置跨域三种方式,启动项目进行测试。访问http://127.0.0.1:4321/

源码地址

2.1 局部注解

@PostMapping("/annotation")
@CrossOrigin
public String annotation() {return "注解实现跨域";
}

2.2 第一种全局

/*** 方式一** @see <a href="https://blog.csdn.net/qq_37651252/article/details/106630443">跨域配置方式一</a>*/
@Bean
public CorsFilter first() {CorsConfiguration config = new CorsConfiguration();//允许所有域名进行跨域调用//config.addAllowedOrigin("*");//springboot2+不适用该方法config.addAllowedOriginPattern("*");//允许跨越发送cookieconfig.setAllowCredentials(true);//放行全部原始头信息config.addAllowedHeader("*");//允许所有请求方法跨域调用,使用大写的方可config.addAllowedMethod("GET");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsFilter(source);
}

2.3 第二种全局

/*** 方法二*/
@Bean
public FilterRegistrationBean second() {FilterRegistrationBean registrationBean = new FilterRegistrationBean();//注入过滤器registrationBean.setFilter((servletRequest, servletResponse, filterChain) -> {HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");//响应头设置httpServletResponse.setHeader("Access-Control-Allow-Headers", "*");//响应类型httpServletResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨越发送cookiehttpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");filterChain.doFilter(servletRequest, servletResponse);});//过滤器名称registrationBean.setName("CrossOrigin");//拦截规则registrationBean.addUrlPatterns("/*");//过滤器顺序registrationBean.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE);return registrationBean;
}

2.4 第三种全局

@Component
public class SystemWebMvcConfigurer extends WebMvcConfigurationSupport {/*** 跨域配置*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowCredentials(true).allowedOriginPatterns("*").allowedHeaders("*").allowedMethods("*");}
}

ials(true)
.allowedOriginPatterns(““)
.allowedHeaders(”
”)
.allowedMethods(“*”);
}
}

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

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

相关文章

06.sqlite3学习——DQL(数据查询)(全)

目录 SQLite——DQL&#xff08;数据查询&#xff09; 数据集 select语句 条件查询 比较 确定范围 确定集合 like 查询记录 查询不重复的记录 排序和限制 排序 限制 聚合 聚合函数 语法 SQLite Group By详解 语法 实例 SQLite Having 子句 语法 实例 多…

[JavaWeb]【十一】web后端开发-SpringBootWeb案例(登录)

目录 一、登录功能 1.1 思路 1.2 LoginController 1.3 EmpService 1.4 EmpServiceImpl 1.5 EmpMapper 1.6 启动服务-测试 1.7 前后端联调 二、登录校验&#xff08;重点&#xff09; 2.1 问题 2.2 问题分析 2.3 登录校验​编辑 2.4 会话技术 2.4.1 会话技术 2.4.2 …

QT使用QXlsx实现Excel图片与图表操作 QT基础入门【Excel的操作】

构建图表数据 /// 构建图表数据for (int i = 1; i < 10; ++i) {mxlsx.write(i, 1, i * i * i); // A1:A9mxlsx.write(i, 2, i * i); // B1:B9mxlsx.write(i, 3, i * i - 1); // C1:C9} 需要包含头文件 #include "xlsxchart.h" 1. 饼状图 Chart *pieChart = mxlsx.…

hive可以删除单条数据吗

参考&#xff1a; hive只操作几条数据特别慢 hive可以删除单条数据吗_柳随风的技术博客_51CTO博客

SpringBoot权限认证

SpringBoot的安全 常用框架&#xff1a;Shrio,SpringSecurity 两个功能&#xff1a; Authentication 认证Authorization 授权 权限&#xff1a; 功能权限访问权限菜单权限 原来用拦截器、过滤器来做&#xff0c;代码较多。现在用框架。 SpringSecurity 只要引入就可以使…

2023年6月GESP C++ 三级试卷解析

2023年6月GESP C 三级试卷解析 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 1.高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在计算机上运行的可执行代码。 A.编辑 B.保存 C.调试 D.编译 【答案】D 【考纲知识点…

FPGA GTX全网最细讲解,aurora 8b/10b协议,OV5640板对板视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX 接收接口GTX IP核调用和使用 4、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTX aurora 8b/10b数据对…

最新域名和子域名信息收集技术

域名信息收集 1&#xff0e;WHOIS查询 WHOIS是一个标准的互联网协议&#xff0c;可用于收集网络注册信息、注册域名﹑IP地址等信息。简单来说&#xff0c;WHOIS就是一个用于查询域名是否已被注册及注册域名详细信息的数据库&#xff08;如域名所有人、域名注册商&#xff09;…

什么是MVC模式?描述每个组件的作用?解释关系型数据库和非关系型数据库的区别?

1、什么是MVC模式&#xff1f;描述每个组件的作用。 MVC模式&#xff08;Model-View-Controller&#xff09;是一种常见的软件设计模式&#xff0c;用于将应用程序的逻辑、用户界面和数据分离为三个组件。 MVC模式中的三个组件如下&#xff1a; Model&#xff08;模型&#…

pytorch下的scatter、sparse安装

知道自己下载的torch配置 import torch print(torch.__version__) print(torch.version.cuda)进入网站&#xff0c;选择自己配置 https://pytorch-geometric.com/whl/下载相应的包 安装 pip install ******.whl

【音视频】 视频的播放和暂停,当播放到末尾时触发 ended 事件,循环播放,播放速度

video 也可以 播放 MP3 音频&#xff0c;当不想让 视频显示出来的话&#xff0c;可以 给 video 设置宽和高 1rpx &#xff0c;不可以隐藏 <template><view class"form2box"><u-navbar leftClick"leftClick"><view slot"left&q…

Qt 查找文件夹下指定类型的文件及删除特定文件

一 查找文件 bool MyXML::findFolderFileNames() {//指定文件夹名QDir dir("xml");if(!dir.exists()){qDebug()<<"folder does not exist!";return false;}//指定文件后缀名&#xff0c;可指定多种类型QStringList filter("*.xml");//指定…

Uniapp笔记(八)初识微信小程序

一、微信小程序基本介绍 1、什么是微信小程序 微信小程序简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用“触手可及”的梦想&#xff0c;用户扫一扫或搜一下即可打开应用 小程序是一种新的开放能力&#…

04_21 slab分配器 分配对象实战

目的 ( slab块分配器分配内存)&#xff0c;编写个内核模块&#xff0c;创建名称为 “mycaches"的slab描述符&#xff0c;小为40字节, align为8字节&#xff0c; flags为0。 从这个slab描述符中分配个空闲对象。 代码大概 内核模块中 #include <linux/version.h>…

深度学习模型数值稳定性——梯度衰减和梯度爆炸的说明

文章目录 0. 前言1. 为什么会出现梯度衰减和梯度爆炸&#xff1f;2. 如何提高数值稳定性&#xff1f;2.1 随机初始化模型参数2.2 梯度裁剪&#xff08;Gradient Clipping&#xff09;2.3 正则化2.4 Batch Normalization2.5 LSTM&#xff1f;Short Cut&#xff01; 0. 前言 按照…

【LeetCode-中等题】2. 两数相加

文章目录 题目方法一&#xff1a;借助一个进制位&#xff0c;以及更新尾结点方法一改进&#xff1a;相比较第一种&#xff0c;给head一个临时头节点&#xff08;开始节点&#xff09;&#xff0c;最后返回的时候返回head.next&#xff0c;这样可以省去第一次的判断 题目 方法一…

JVM——类加载与字节码技术—类文件结构

由源文件被编译成字节码文件&#xff0c;然后经过类加载器进行类加载&#xff0c;了解类加载的各个阶段&#xff0c;了解有哪些类加载器&#xff0c;加载到虚拟机中执行字节码指令&#xff0c;执行时使用解释器进行解释执行&#xff0c;解释时对热点代码进行运行期的编译处理。…

idea的debug断点的使用

添加断点&#xff08;目前不知道如何添加断点&#xff0c;就给AutoConfigurationImportSelector的每个方法都加上断点&#xff09;&#xff1a; 然后将StockApplication启动类以debug方式运行&#xff0c;然后程序就会停在119行 点击上边的step over让程序往下运行一行&#x…

《入门级-Cocos2dx4.0 塔防游戏开发》---第七课:游戏界面开发(自定义Layer)

目录 一、开发环境 二、开发内容 2.1 添加资源文件 2.2 游戏MenuLayer开发 2.3 GameLayer开发 三、演示效果 四、知识点 4.1 sprite、layer、scene区别 4.2 setAnchorPoint 一、开发环境 操作系统&#xff1a;UOS1060专业版本。 cocos2dx:版本4.0 环境搭建教程&…

2.3.Dubbo的基本应用- 异步调用 、泛化调用 、动态配置

异步调用 官网地址&#xff1a; http://dubbo.apache.org/zh/docs/v2.7/user/examples/async-call/ 理解起来比较容易&#xff0c; 主要要理解CompletableFuture&#xff0c; 如果不理解&#xff0c; 就直接把它理解为Future 其他异步调用方式&#xff1a;Dubbo 同步调用太慢&a…