springSecruity--->和springboot结合的跨域问题
🤦♂️这个是我在springboot中使用springSecruity写一个小demo时遇到的问题,记录下来🤦♂️
文章目录
- 跨域请求
- springboot项目中使用springSecruity导致跨域请求@CrossOrigin请求失效解决方法
- springboot 中的跨域方法
跨域请求
什么是跨域请求,为啥会有跨域请求?👍
跨域请求,就是说浏览器在执行脚本文件的ajax请求时,脚本文件所在的服务地址和请求的服务地址不一样。说白了就是ip、网络协议、端口都一样的时候,就是同一个域,否则就是跨域。这是由于Netscape提出一个著名的安全策略——同源策略造成的,这是浏览器对JavaScript施加的安全限制。是防止外网的脚本恶意攻击服务器的一种措施。
俺们先来看看请求又有哪几种吧:
1.简单请求:
简单请求是指符合跨域请求规范中定义的一种简单请求类型。简单请求必须满足以下条件:
请求方法限于 GET、POST 或 HEAD;
只能使用以下几种 Content-Type:application/x-www-form-urlencoded、multipart/form-data、text/plain;
请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器;
请求中没有使用 ReadableStream 对象;
请求中的任意 ReadableStream 对象均没有被启动;
请求的 method 属性不是 GET、HEAD 或 POST 以外的字符串;
请求的带有信函头之一。
简单请求不会触发预检请求(OPTIONS 请求),而是直接发送实际的请求。这样可以减少跨域请求的复杂性和延迟。
对于简单请求
CORS的策略是请求时在请求头中增加一个Origin字段,服务器收到请求后,根据该字段判断是否允许该请求访问。
1.如果允许,则在 HTTP 头信息中添加 Access-Control-Allow-Origin 字段,并返回正确的结果 ;
2.如果不 允许,则不在 HTTP 头信息中添加 Access-Control-Allow-Origin 字段 。
2.非简单请求
对于非简单请求的跨源请求,浏览器会在真实请求发出前,增加一次OPTION请求,称为预检请求(preflight request)。预检请求将真实请求的信息,包括请求方法、自定义头字段、源信息添加到 HTTP 头信息字段中,询问服务器是否允许这样的操作。
例如一个DELETE请求:
OPTIONS /test HTTP/1.1
Origin: http://www.examples.com
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: X-Custom-Header
Host: www.examples.com
与 CORS 相关的字段有:
请求使用的 HTTP 方法 Access-Control-Request-Method ;
请求中包含的自定义头字段 Access-Control-Request-Headers 。
服务器收到请求时,需要分别对 Origin、Access-Control-Request-Method、Access-Control-Request-Headers 进行验证,验证通过后,会在返回 HTTP头信息中添加 :Access-Control-Allow-Origin: http://www.examples.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000
他们的含义分别是:Access-Control-Allow-Methods: 真实请求允许的方法
Access-Control-Allow-Headers: 服务器允许使用的字段
Access-Control-Allow-Credentials: 是否允许用户发送、处理 cookie
Access-Control-Max-Age: 预检请求的有效期,单位为秒。有效期内,不会重复发送预检请求
当预检请求通过后,浏览器会发送真实请求到服务器。这就实现了跨源请求。
总之:跨域请求会经历的几个步骤也就这几步
1.访问另一个域的资源。
2.有可能会发起一次预检请求(非简单请求,或超过了 Max-Age)。
3.发起实际请求。
springboot项目中使用springSecruity导致跨域请求@CrossOrigin请求失效解决方法
第一步
想访问的controller类该加上@CrossOrigin还加上,不要删除
第二步
配置springSecruity配置类,添加跨域配置
下面代码中通过调用http.cors().and().csrf().disable()方法来启用跨域配置并禁用CSRF保护。
package com.example.sec_demo1.config;/*** @ClassName Sccc* @Description TODO* @Author zyhh* @date 2024/2/29 14:27* @version: 1.0*/import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.cors.CorsUtils;/*** SpringSecurity配置类*/
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {/*** 授权** @param http* @throws Exception*/@Overrideprotected void configure(HttpSecurity http) throws Exception {// 开启跨域访问http.cors(); //.disable();// 开启模拟请求,比如API POST测试工具的测试,不开启时,API POST为报403错误http.csrf().disable();// iframe 跳转错误处理 Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'deny'http.headers().frameOptions().disable();// 当出现跨域的OPTIONS请求时,发现被拦截,加入下面设置可实现对OPTIONS请求的放行。http.authorizeRequests().requestMatchers(CorsUtils::isPreFlightRequest).permitAll();}
}
第三步
配置一个CorsConfigurationSource的Bean来定义跨域配置。
通过CorsConfigurationSource的Bean定义了允许的来源、方法和头部,并将其应用到所有路径上。
@Configuration
public class CorsConfig {@Beanpublic CorsConfigurationSource corsConfigurationSource() {CorsConfiguration configuration = new CorsConfiguration();configuration.addAllowedOrigin("*");configuration.addAllowedMethod("*");configuration.addAllowedHeader("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", configuration);return source;}
}
=============== over ===================================
再补充一点哈哈
springboot 中的跨域方法
有三种
1.针对单个 API的
2.针对整个应用的
3.在一些情况下是等效的,而在另一些情况下却又出现不同
针对单个API的
其实就是使用@CrossOrigin。可以加类上,也可以加单个方法上。
针对整个应用的
实现 WebMvcConfigurerz中的addCorsMappings 方法
/*** SpringMVC 跨域配置*/
@Configuration
public class MvcConfig implements WebMvcConfigurer {@Beanpublic CorsFilter corsFilter() {final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();final CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.setAllowCredentials(true); /*是否允许请求带有验证信息*/corsConfiguration.addAllowedOrigin("*");/*允许访问的客户端域名*/corsConfiguration.addAllowedHeader("*");/*允许服务端访问的客户端请求头*/corsConfiguration.addAllowedMethod("*"); /*允许访问的方法名,GET POST等*/corsConfiguration.addExposedHeader("token");/*暴露哪些头部信息 不能用*因为跨域访问默认不能获取全部头部信息*/corsConfiguration.addExposedHeader("TOKEN");corsConfiguration.addExposedHeader("Authorization");urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);return new CorsFilter(urlBasedCorsConfigurationSource);}
}
在一些情况下是等效的,而在另一些情况下却又出现不同
注入 CorsFilter
注入 CorsFilter 不止这一种方式,我们还可以通过注入一个 FilterRegistrationBean 来实现,这里就不给例子了。
@WebFilter("/*")
public class CORSFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException, ServletException, IOException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse resp = (HttpServletResponse) servletResponse;// 告诉浏览器允许所有的域访问// 注意 * 不能满足带有cookie的访问,Origin 必须是全匹配// resp.addHeader("Access-Control-Allow-Origin", "*");// 解决办法通过获取Origin请求头来动态设置String origin = request.getHeader("Origin");if (StringUtils.hasText(origin)) {resp.addHeader("Access-Control-Allow-Origin", origin);}// 允许带有cookie访问resp.addHeader("Access-Control-Allow-Credentials", "true");// 告诉浏览器允许跨域访问的方法resp.addHeader("Access-Control-Allow-Methods", "*");// 告诉浏览器允许带有Content-Type,header1,header2头的请求访问// resp.addHeader("Access-Control-Allow-Headers", "Content-Type,header1,header2");// 设置支持所有的自定义请求头String headers = request.getHeader("Access-Control-Request-Headers");if (StringUtils.hasText(headers)) {resp.addHeader("Access-Control-Allow-Headers", headers);}// 告诉浏览器缓存OPTIONS预检请求1小时,避免非简单请求每次发送预检请求,提升性能resp.addHeader("Access-Control-Max-Age", "3600");chain.doFilter(request, resp);}
}
以上是springboot才需要的配置,如果是springboot+springSecruity。这些是没办法使用的。得使用
CorsConfigurationSource配置类和 继承WebSecurityConfigurerAdapter类并实现configure方法。
相关文章:
springSecruity--->和springboot结合的跨域问题
🤦♂️这个是我在springboot中使用springSecruity写一个小demo时遇到的问题,记录下来🤦♂️ 文章目录 跨域请求springboot项目中使用springSecruity导致跨域请求CrossOrigin请求失效解决方法springboot 中的跨域方法 跨域请求 什么是跨…...
网关kong记录接口处理请求和响应插件 tcp-log-with-body的安装
tcp-log-with-body 介绍 Kong的tcp-log-with-body插件是一个高效的工具,它能够转发Kong处理的请求和响应。这个插件非常适用于需要详细记录API请求和响应信息的情景,尤其是在调试和排查问题时。 软件环境说明 kong version 2.1.4 - 2.8.3 [可用亲测]C…...
ElasticSearch之Completion Suggester
写在前面 通过completion suggester可以实现如下的效果: 其实就是做的like xxx%这种。通过FST这种数据结构来存储,实现快速的前缀匹配,并且可以将es所有的数据加载到内存中所以速度completion的查询速度非常快。 需要注意,如果…...
ant 布局组件 组件等高设置
背景: 想实现一个和content等高的侧边栏,并增加侧边栏导航。 ant组件概述 Layout:布局容器,其下可嵌套 Header Sider Content Footer 或 Layout 本身,可以放在任何父容器中。Header:顶部布局,…...
不可多得的干货,网易的朋友给我这份339页的Android面经
这里先放上目录 一 性能优化 1.如何对 Android 应用进行性能分析 android 性能主要之响应速度 和UI刷新速度。 首先从函数的耗时来说,有一个工具TraceView 这是androidsdk自带的工作,用于测量函数耗时的。 UI布局的分析,可以有2块&#x…...
Qt项目:网络1
文章目录 项目:网路项目1:主机信息查询1.1 QHostInfo类和QNetworkInterface类1.2 主机信息查询项目实现 项目2:基于HTTP的网络应用程序2.1 项目中用到的函数详解2.2 主要源码 项目:网路 项目1:主机信息查询 使用QHostI…...
软件测试有哪些常用的测试方法?
软件测试是软件开发过程中重要组成部分,是用来确认一个程序的质量或者性能是否符合开发之前提出的一些要求。软件测试的目的有两方面,一方面是确认软件的质量,另一方面是提供信息,例如,给开发人员或者程序经理反馈意见…...
【C语言基础】:深入理解指针(一)
文章目录 一、内存和地址1. 内存2. 如何理解编址 二、指针变量和地址2.1 取地址操作符(&)2.2 指针变量和解引用操作符(*)2.2.1 指针变量2.2.2 如何拆解指针变量2.2.3 解引用操作符 2.3 指针变量的大小 三、指针变量类型的意义3.1 指针的解引用3.2 指针 - 整数3.3 void*指针…...
单点故障解决方案之Smart Link与Monitor Link
-SmartLink技术,创建Smart Link 组。在该组中,加入两个端口。其中1个端口是主端口,也称之为Master端口。另外1个端口是备份端口:也称之为 Slave 端口。 -Monitor Link 组也称之为“监控链路组,由上行端口和下行端口共同组成。下行…...
QT之QSharedMemory共享内存
QSharedMemory是qt提供对共享内存操作的类,主要用来对内存卡写数据和读数据。 常用api: 1、void QSharedMemory::setKey(const QString &key) 为共享内存设置键值。如何当前的内存共享对象已经链接到底层的共享内存段(isAttached)&…...
string 类 经典习题之数字字符相加
题目: 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 题目来源࿱…...
通讯录——C语言实现
头文件Contact.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #pragma once #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30//表示一个人的信息 //struct…...
优思学院|3步骤计算出Cpk|学习Minitab
在生产和质量管理中,准确了解和控制产品特性至关重要。一个关键的工具是Cpk值,它是衡量生产过程能力的重要指标。假设我们有一个产品特性的规格是5.080.02,通过收集和分析过程数据,我们可以计算出Cpk值,进而了解生产过…...
【Java编程进阶之路 06】深入探索:JDK、JRE与JVM的关系与差异
JDK、JRE与JVM:揭开Java运行环境的神秘面纱 在Java开发者的日常工作中,JDK、JRE和JVM这三个概念是不可或缺的。它们构成了Java应用程序的运行环境,但很多初学者可能对这三者的关系和差异感到困惑。本文旨在详细解析JDK、JRE和JVM之间的关系&…...
Linux中的touch命令
在Linux中,touch命令主要用于创建空的文件或者更新已存在文件的时间戳。下面是 touch命令的使用方式和示例说明: 创建空文件 要创建一个空文件,可以使用 touch命令并指定文件名,如下所示: touch new_fi…...
智能驾驶规划控制理论学习-基于采样的规划方法
目录 一、基于采样的规划方法概述 二、概率路图(PRM) 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树(RRT) 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…...
二叉树——二叉树所有路径
二叉树所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5] 输出:["1->2->5","1-…...
算法训练营day38(补),动态规划6
package main func max(a, b int) int { if a > b { return a } return b } 背包最大重量为4。 物品为: 重量价值物品0115物品1320物品2430 每件商品都有无限个! 问背包能背的物品最大价值是多少? func package03(weight, value []…...
【java、微服务、nacos】nacos服务分级存储模型
Nacos服务分级存储模型 ① 一级是服务,例如userservice ②二级是集群,例如杭州或上海 ③ 三级是实例,例如杭州机房的某台部署了userservice的服务器 配置实例集群属性 改变服务的yml文件 spring:cloud:nacos:discovery:cluster-name: H…...
共享旅游卡:打开0费用旅游新纪元,探索40+精彩线路
随着现代生活节奏的加快,旅游成为了许多人释放压力、寻求乐趣的方式。然而,面对琳琅满目的旅游线路和不断上涨的旅游费用,许多人望而却步。 今天,我们要为您介绍一种颠覆传统旅游方式的创新产品——共享旅游卡。它不仅能让您以0费…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能 查看官网:https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...
