关于Spring Security的CORS

news2025/1/13 19:40:58

目录

一、CORS是什么

二、同源安全策略

三、Spring Security中CORS的开启

四、其它处理方法


一、CORS是什么

        CORS(Cross-Origin Resource Sharing,跨源/域资源共享 )是一个W3C标准,一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本(比如AJAX)请求访问的机制,通常由于同源安全策略,浏览器会禁止这种跨域请求。

        CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器不能低于 IE10。

        整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附件的头信息,有时还会多处一次附件的请求,但用户不会有感觉。

        因此,实现CORS通信的关键是服务器。只要服务器实现了CORS功能(响应报文包括了正确的CORS响应头),就可以被跨源访问(可以指定个别域或全部域)。

二、同源安全策略

        说到跨域请求,就不得不说一下“同源安全策略”了,如果没有这个策略的存在,也就没有这么多事了,但是,这样可能会造成你在网站进行一些操作时存在风险。

        同源策略是一个重要的安全策略,它用于限制一个源/域的文档或它加载的脚本是否能与另一个源/域的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。

        出于安全性,浏览器会限制脚本内发起的跨域HTTP请求,例如常见的 XHR、Fetch API 都遵循同源策略。

        如果两个 URL 的协议(Protocol)、主机(Host)、端口(Port,如果有指定的话)都相同的话,那么这两个 URL 是同源的,否则是不同源的。

        当浏览器中打开的某个网页,有脚本执行了跨域请求,那么,浏览器的“同源安全策略”就会介入,大致流程如下:

        浏览器直接发出CORS请求,也就是在头信息之中,增加一个Origin字段。这个字段代表本次请求来自哪个源(协议 + 主机 + 端口),服务器会根据这个值,决定是否同意这次请求。前面的流程是对于HTTP简单请求,如果是HTTP非简单请求,则会在正式请求前,增加一次预检请求。

        如果Origin指定的源,不在许可范围内(服务器端CORS功能指定),服务器会返回一个正确的HTTP回应。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin字段,就知道出错了,从而抛出一个错误,被XMLHttpRequestonerror回调函数捕获。注意,这种错误无法通过状态识别,因为HTTP回应的状态码有可能是 200

        抛出的错误为“has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.”,如下:

三、Spring Security中CORS的开启

        在Spring框架中,我们可以在引入Spring Security依赖后,对Security的HttpSecurity进行设置,来开启CORS(跨域/源资源共享),同时能指定只被部分域/源、部分方法、部分头部信息访问资源。

        Spring框架提供了CorsFilter,是为了在基于filter的安全框架(如Spring Security)上面支持CORS,或者在使用其他不支持CORS的库上支持CORS。

//(Security6.2.4写法)先创建一个普通JAVA类,如SecurityConfig.java,实现如下3个Bean。
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(
                (authz) -> authz
                        .anyRequest().authenticated())
            .httpBasic(withDefaults())
            .formLogin(withDefaults())
            .csrf((csrf)->csrf.disable())
            .cors(withDefaults()); //开启CORS(跨域/源资源共享)
        return http.build();
    }

    @Autowired //自动装配参数configurationSource(下方的Bean)
    @Bean
    public CorsFilter corsFilter(UrlBasedCorsConfigurationSource configurationSource){
        return new CorsFilter(configurationSource);
    }

    // 也可以将方法内的实现整合到上面的corsFilter方法体内
    @Bean
    public UrlBasedCorsConfigurationSource configurationSource(){
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOriginPattern("http://localhost*"); //新版本写法
        //corsConfiguration.addAllowedOrigin("*"); //老版本写法
        source.registerCorsConfiguration("/**",corsConfiguration);
        return source;
    }

四、其它处理方法

1、Spring注解

        原理:自Spring Framework 4.2开始,CORS请求(包括OPTIONS method)会被自动分发到各种注册过的HandlerMappings。它们会处理CORS的preflight请求,会拦截CORS简单和实际请求,以便基于你指定的CORS配置,添加相关的CORS响应头(如 Access-Control-Allow-Origin)。

        实现:在@RequestMapping注解过的controller method上面添加@CrossOrigin注解,表示已开启CORS。

@CrossOrigin(origins = "http://domain2.com", maxAge = 3600) //括号内为指定的CORS配置
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin("http://domain2.com") //同时使用controller级别和method级别的CORS配置,Spring会将二者的attributes结合起来,创建出融合的CORS配置。
    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }
}

        除了基于注解@CrossOrigin的配置(细粒度),还可以定义全局的CORS配置。类似于使用filters,但可以定义在Spring MVC中,并与细粒度的@CrossOrigin配置相配合。

2、JSONP(JSON with Padding)

        原理:利用<script>标签不受浏览器同源策略限制的特性,通过动态插入<script>标签的方式实现跨域数据访问。
        实现:客户端创建一个<script>标签,将请求后端的接口URL拼接一个回调函数名称作为参数传给后端,并设置给<script>标签的src属性。后端接收到请求后,将数据和回调函数名称拼接成函数调用的形式返回。客户端在接收到响应后,会执行这个回调函数,从而获取到后端返回的数据。

3、使用代理服务器

        原理:通过搭建一个代理服务器来转发客户端的请求,代理服务器与目标服务器进行通信,然后将返回的数据再转发给客户端。由于客户端和代理服务器、代理服务器和目标服务器之间的通信都在服务器端进行,因此不受浏览器同源策略的限制。
        实现:可以使用Nginx、Node.js等搭建代理服务器。例如,Nginx可以通过配置反向代理来解决跨域问题;Node.js可以搭建一个中间层服务器,接收客户端的请求,然后将请求转发给目标服务器,并将返回的数据再转发给客户端。

4、前端正向代理

        原理:在客户端设置一个代理服务器,并指定目标服务器。代理服务器向目标服务器转交请求,并将获得的内容发送给客户端。这种方式在客户端进行了请求转发,但同样实现了跨域请求。
        实现:可以通过在客户端代码中配置代理服务器地址和端口,以及目标服务器的地址和端口来实现。在发送请求时,将请求地址替换为代理服务器的地址,并在代理服务器中进行请求转发。

5、配置浏览器插件或工具

        有些浏览器插件或工具(如Postman、curl等)可以绕过浏览器的同源策略限制,直接发送跨域请求。但这种方法主要用于开发和测试阶段,不建议在生产环境中使用。

相关文章:关于Spring Security的CSRF

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

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

相关文章

苹果WWDC揭晓AI系统、电脑等设备系统全线更新,iPhone将接入ChatGPT

iOS 18可自定义主屏幕、可卫星发短信、钱包App新增点击付款Tap to Cash功能、照片App大改、支持RCS短信&#xff1b;iPad首次有原生计算器App&#xff0c;iPad结合Apple Pencil拥有数学笔记功能&#xff1b;新版macOS可通过Mac查看控制iPhone&#xff0c;Safari有AI驱动的高亮显…

Docker:安装 Orion-Visor 服务器运维的技术指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 Orion-Visor 是一种用于管理和监控容器的工具。它提供了一个直观的界面&#xff0c;用于查看容器的状态、资源使用情况以及日志等信息。在这篇技术博客中&#xff0c;我们将介绍如何…

01.FastLED库基础

FastLED库基础 FastLED库HSV颜色 HSV颜色基本概念 HSV颜色简介 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色表达方法。该方法中的三个参数分别是&#xff1a;色调&#xff08;H&#xff09;&#xff0c;饱和度&#xff08;S&#…

Jenkins三种构建类型

目录 传送门前言一、概念二、前置处理&#xff08;必做&#xff09;1、赋予777权限2、让jenkins用户拥有root用户的kill权限3、要运行jar包端口号需要大于1024 三、自由风格软件项目&#xff08;FreeStyle Project&#xff09;&#xff08;推荐&#xff09;三、Maven项目&#…

最全面又最浅显易懂的Langchain快速上手教程(下)

最全面又最浅显易懂的Langchain快速上手教程&#xff08;下&#xff09; 三. 深入Langchain 1. 架构设计 从上文知道Langchain在架构上使用了从抽象、到具体、再到整合适配的三层架构&#xff0c;这种一层一层逐渐具体的设计最大可能性的保证了架构的可扩展性和维护性。同时…

【Python】 探索 Python 中的 Ellipsis 对象:一个神奇的省略号

基本原理 在 Python 中&#xff0c;Ellipsis 对象是一个特殊的内置对象&#xff0c;它通常用三个连续的点 ... 来表示。这个对象在 Python 中有几个特定的用途&#xff0c;尤其是在切片操作和迭代器表达式中。虽然它看起来像是一个普通的省略号&#xff0c;但它实际上是 Pytho…

DeepSORT(目标跟踪算法)中自由度决定卡方分布的形状

DeepSORT&#xff08;目标跟踪算法&#xff09;中自由度决定卡方分布的形状 flyfish 重要的两个点 自由度决定卡方分布的形状&#xff08;本文&#xff09; 马氏距离的平方在多维正态分布下服从自由度为 k 的卡方分布 独立的信息 在统计学中&#xff0c;独立的信息是指数据…

MySQL的group by与count(), *字段使用问题

文章目录 问题group by到底做了什么举个例子简单来说为什么select字段&#xff0c;count()不能和*共同使用总结 问题 这是一段摘抄自MySQL官网的文字。其大致意思是MySQL拓展了group by的使用&#xff0c;MySQL允许选择没有出现在group by中的字段。换句话说&#xff0c;标准SQ…

覆盖路径规划经典算法 The Boustrophedon Cellular Decomposition 论文及代码详解

2000年一篇论文 Coverage of Known Spaces: The Boustrophedon Cellular Decomposition 横空出世&#xff0c;解决了很多计算机和机器人领域的覆盖路径问题&#xff0c;今天我来详细解读这个算法。 The Boustrophedon Cellular Decomposition 算法详解 这篇论文标题为"C…

【Qt】TreeWidget中Item的UserCheckable注意事项,没有出现多选框

1. 异常 开启 ItemIsUserCheckable以后&#xff0c;界面上没有出现多选框。 QTreeWidgetItem *item new QTreeWidgetItem();item->setText(0, "hello");item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsSelectable |Qt::ItemIsEnabled | Qt::ItemIsAuto…

最新thinkphp5内核全开源女神赢口红H5公众号版第五版(100%可经营)

最新thinkphp5内核全开源女神赢口红H5公众号版第五版&#xff08;100%可经营&#xff09; 搭建教程 1、程序为thinkPHP5开发 php版本要求5.6&#xff01;不支持虚拟主机&#xff01; 2、上传程序到您的根目录&#xff01;导入m213.sql文件&#xff01;修改数据库配置文件app…

Github 2024-06-10 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目2Go项目2PHP项目1Blade项目1TypeScript项目1Lua项目1Dart项目1Swift项目1Cuda项目1Python项目1MDX项目1Ventoy: 100%开源的可启动USB解决方…

考虑双碳分时价格的综合能源系统低碳优化调度

目录 一、主要内容介绍&#xff1a; 二、仿真结果&#xff1a; 三、研究内容&#xff1a; 四、代码下载&#xff1a; 一、主要内容介绍&#xff1a; 在含电热气多种能源的综合能源系统中&#xff0c;复杂的能量转换关系以及可再生能源和负荷的波动性&#xff0c;给综合能源…

必备:产品经理工作文档大全

产品经理&#xff08;英文&#xff1a;Product manager&#xff0c;缩写&#xff1a;PM&#xff09;也称产品企划&#xff0c;是指在公司中针对某项或某类的产品进行规划和管理的人员&#xff0c;主要负责产品的研发、制造、营销、渠道等工作。 产品经理是很难定义的一个角色&a…

群体优化算法---水波优化算法介绍以及应用于聚类数据挖掘代码示例

介绍 水波优化算法&#xff08;Water Wave Optimization, WWO&#xff09;是一种新兴的群智能优化算法&#xff0c;灵感来自水波在自然环境中的传播和衰减现象。该算法模拟了水波在水面上传播和碰撞的行为&#xff0c;通过这些行为来寻找问题的最优解。WWO算法由三种主要的操作…

如何发挥物联网电能表的优势

发挥物联网电能表的优势&#xff0c;对于提升电力系统的智能化水平、优化电力资源配置、提高用电效率以及促进环保发展等方面都具有重要意义。 一、实时监测与数据分析 物联网电能表的核心优势在于其能够实时监测电力使用情况&#xff0c;并通过无线网络将数据传输到云平台。…

【数据结构】图论——AOV和AOE(拓扑排序、存放表达式、关键活动、关键路径)

目录 AOV和AOEAOV 有向无环图及其应用(拓扑结构)有向无环图的应用——存放表达式二叉树存放表达式图存放表达式 AOE 有向无环图及其应用——关键路径1. 事件的最早发生时间事件&#xff08;顶点&#xff09;最早发生时间的计算方法&#xff1a; 2. 事件允许的最晚发生时间事件(…

CV每日论文--2024.6.7

1、Convolutional Neural Networks and Vision Transformers for Fashion MNIST Classification: A Literature Review 中文标题&#xff1a;卷积神经网络和视觉变换器在Fashion MNIST分类任务中的应用:文献综述 简介&#xff1a;本文综述了在Fashion MNIST数据集上使用卷积神…

idea鼠标滚轮滚动放大缩小字体

在idea中的【file】->【settings】菜单&#xff0c;弹出settings窗口&#xff0c;点击窗口中的【Editor】->【General】&#xff0c;在右侧窗口中&#xff0c;选中【Change font size with CtrlMouse Wheel in All editors】即可。

mmyolo

cal_map2测试有问题&#xff0c; /home/lsw/miniconda3/envs/mmyolo/lib/python3.8/site-packages/torch/functional.py:445: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ../aten/s…