当前位置:首页 > 数码 > Spring-Boot中CORS疑问及处置方法-源码解析 (springernature)

Spring-Boot中CORS疑问及处置方法-源码解析 (springernature)

admin6个月前 (05-03)数码36

CORS(跨源资源共享)是一种Web规范,准许来自不同源的Web页面共享资源。在SpringBoot运行程序中,CORS疑问或者会产生,由于阅读器会阻止来自不同源的恳求。自动状况下,SpringBoot准许来自同一源的恳求,但会阻止来自不同源的恳求。

要处置CORS疑问,您可以经常使用SpringBoot提供的CORS支持。以下是一些或者的处置打算:

您可以在SpringBoot运行程序的主类上参与@CrossOrigin注解,以准许来自一切源的恳求。例如:

@SpringBootlicationpublicclassMyApplication{publicstaticvoidmn(String[]args){SpringApplication.run(MyApplication.class,args);}@BeanpublicWebMvcConfigurercorsConfigurer(){returnnewWebMvcConfigurer(){@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry.addMapping("/**").allowedOrigins("*").allowedMethods("*").allowedHeaders("*");}};}}

在下面的示例中,咱们创立了一个WebMvcConfigurerbean,并笼罩了addCorsMappings方法。咱们经常使用CorsRegistry对象来定义CORS规定。在这个例子中,咱们准许来自一切源的恳求,并准许一切方法和头部。

假设您只想为特定的控制器或恳求方法启用CORS,您可以在控制器类或恳求方法上参与@CrossOrigin注解。例如:

@RestController@RequestMapping("/api")publicclassMyController{@CrossOrigin(origins="*",methods="*",headers="*")@GetMapping("/data")publicResponseEntity<String>getData(){//...}}

在下面的示例中,咱们只在getData方法上启用了CORS。咱们准许来自一切源的恳求,并准许一切方法和头部。

源码解析

假设您须要更细粒度的CORS性能,您可以创立自定义的CorsConfiguration对象,并将其参与到CorsRegistry对象中。例如:

@BeanpublicWebMvcConfigurercorsConfigurer(){returnnewWebMvcConfigurer(){@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){CorsConfigurationconfig=newCorsConfiguration();config.setAllowedOrigins(Arrays.asList("http://example.com","https://example.org"));config.setAllowedMethods(Arrays.asList("GET","POST","PUT","DELETE"));config.setAllowedHeaders(Arrays.asList("X-Requested-With","Content-Type","Authorization"));config.setAllowCredentials(true);registry.addMapping("/**").withConfig(config);}};}

在下面的示例中,咱们创立了一个自定义的CorsConfiguration对象,并设置了准许的源、方法、头部和凭证。而后,咱们将该性能参与到CorsRegistry对象中,以运行于一切的恳求门路。除了上述方法,还有一些其余的处置打算可以用来处置SpringBoot中的CORS疑问。例如:

假设您正在经常使用SpringSecurity,您可以经常使用其提供的CORS支持来处置CORS疑问。以下是一个示例性能:

@Configuration@EnableWebSecuritypublicclassSecurityConfigextendsWebSecurityConfigurerAdapter{@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{http.cors().and()....}@BeanpublicCorsConfigurationSourcecorsConfigurationSource(){CorsConfigurationconfiguration=newCorsConfiguration();configuration.setAllowedOrigins(Arrays.asList("http://example.com","https://example.org"));configuration.setAllowedMethods(Arrays.asList("GET","POST","PUT","DELETE"));configuration.setAllowedHeaders(Arrays.asList("X-Requested-With","Content-Type","Authorization"));configuration.setAllowCredentials(true);UrlBasedCorsConfigurationSourcesource=newUrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**",configuration);returnsource;}}

在下面的示例中,咱们创立了一个CorsConfigurationSourcebean,并设置了准许的源、方法、头部和凭证。而后,咱们在HttpSecurity对象上调用cors()方法来启用CORS支持,并将CorsConfigurationSource对象传递给该方法。

您还可以创立一个自定义的过滤器来处置CORS疑问。以下是一个示例性能:

@ComponentpublicclassCorsFilterextendsOncePerRequestFilter{@OverrideprotectedvoiddoFilterInternal(HttpServletRequestrequest,HttpServletResponseresponse,FilterChainfilterChain)throwsServletException,IOException{CorsConfigurationconfig=newCorsConfiguration();config.setAllowedOrigins(Arrays.asList("http://example.com","https://example.org"));config.setAllowedMethods(Arrays.asList("GET","POST","PUT","DELETE"));config.setAllowedHeaders(Arrays.asList("X-Requested-With","Content-Type","Authorization"));config.setAllowCredentials(true);CorsConfigurationSourcesource=newUrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**",config);CorsFiltercorsFilter=newCorsFilter(source);corsFilter.doFilter(request,response,filterChain);}}

在下面的示例中,咱们创立了一个自定义的CorsFilter类,并笼罩了doFilterInternal方法。在这个方法中,咱们创立了一个CorsConfiguration对象,并设置了准许的源、方法、头部和凭证。而后,咱们创立了一个UrlBasedCorsConfigurationSource对象,并将CorsConfiguration对象注册到该对象中。最后,咱们创立了一个CorsFilter对象,并将其运行到恳求/照应链中。


SpringBoot进阶之处理跨域问题(CORS)

大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开「基础知识」 的铺垫

「大佬可以绕过 ~」

如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了 Springboot 基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有收获 ~

上期带大家学习了 Springboot 中如何集成MyBatis分页插件PageHelper 以及它的一个基本使用, 本期将带大家学习SpringBoot 中如何处理跨域问题的,同样的,我们集成到Springboot 中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码

同样的,为了照顾小白同学,依然先说一下啥是跨域。说到跨域问题,如果你是 前端 同学,肯定不会陌生, 你有可能调接口调着调着,发现请求发布出去,控制台会报CORS 错误, 这时候你会找后台老大哥给你处理一下。然而现在前端工程中,一般都会有proxy代理 ,这样也能解决问题,这只是本地调试,但上线还会有问题, 除非你发布的时候你们是同一个域 下。

好,说了这么多,大概明白跨域是如何产生了,就是说前端调用的后端接口不属于同一个 域(域名或端口不同) ,就会产生跨域问题,也就是说你的应用访问了该应用域名或端口之外的域名或端口,这里给大家总结一下,产生跨域的三个条件:

解决思路大致可以分为以下几方面:

从源头浏览器解决,解除跨域机制,用户自己设置浏览器,这不大现实,好,pass

发送 JSONP 请求替代XHR请求,并不能适用所有的请求方式,不推荐

之前我们提到前端本地工程开启 Proxy ,那么服务端可不可进行代理呢?答案是可以的,怎么做?可以通过nginx 进行代理,给大家简单展示一下:

nginx 是当今比较火的web 服务器,常用于服务代理, 等教大家部署的时候会讲一下

这也是本节要讲的内容,我们先不直接的给大家展示代码,先说一下它的原理。

一般我们下载的浏览器比如 Chrome ,它都是自行默认开启跨域限制 的,那我们如何判断我们发出去的请求是一个跨域请求 呢,打开浏览器开发者工具,在请求的请求头中就可以发现,如果不是一个跨域请求,它只有Host ,如果是一个跨域请求 它会多一个Origin ,告诉浏览器我俩请求的地方不一样

跨源资源共享(CORS) 是一种基于 HTTP头 的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口 ),这样浏览器就可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的预检(OPTION) 请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头,那么具体是怎么设置头 的呢?

服务端通过设置如上,就可以进行跨域访问了。好,有了基本的理论之后,我们一起看一下在 Springboot 中如何解决的:

是不是很简单~ 它的实现机制主要是通过请求 拦截器 实现的,你慢慢会发现,随着学习的深入,你会遇到各种拦截器 技术

本期到这里就结束了,总结一下,本节主要带大家认识了什么是 跨域 ,以及解决思路,最后教大家Sprinboot 中是如何配置跨域访问的,源码已更新,大家可以自行试一下

怎么查看一个springboot项目的源代码在哪?

如果你已经下载并成功部署了一个基于 Spring Boot 的 Java 项目,以下是一些常见的查看后台功能模块代码的途径:1. 项目结构:查看项目的文件结构,通常在项目的根目录下可以找到源代码文件夹(如 `src/main/java`),在该文件夹中可以查看项目的源代码结构。 你可以使用文本编辑器或集成开发环境(IDE)打开这些文件夹,浏览项目的代码文件。 2. IDE工具:使用集成开发环境(IDE)打开项目,如 IntelliJ IDEA、Eclipse 或 NetBeans。 这些工具提供强大的代码导航和搜索功能,可以轻松地查看项目中的各个功能模块。 通过导航栏、项目面板或搜索功能,可以快速定位到特定的类、包或方法,以便查看和编辑代码。 3. 版本控制系统:如果项目使用版本控制系统(如 Git),你可以使用相应的命令行工具或图形界面客户端来查看代码的历史记录和各个版本之间的差异。 这样可以帮助你了解项目代码的演变过程和各个功能模块的修改情况。 4. 文档和注释:项目通常会提供文档或注释,用于解释各个功能模块的用途、实现方式以及相关的配置信息。 你可以查阅项目的文档或代码注释,以获取关于各个功能模块的更详细信息。 需要注意的是,具体的代码结构和位置可能因项目而异,这取决于项目的组织方式和开发者的习惯。 以上提供的方法是一般性的指导,希望能帮助你在项目中找到后台各功能模块的代码。 如果项目有特定的目录结构或配置,你还可以查阅项目的文档或联系项目的开发者获取更具体的信息。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: SpringBoot

“Spring-Boot中CORS疑问及处置方法-源码解析 (springernature)” 的相关文章

概念-Spring-AOP-实现原理和应用-中的 (概念股股票)

概念-Spring-AOP-实现原理和应用-中的 (概念股股票)

什么是AOP? AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,其主要目的是将横切关注点(cross-cutting concern)从主要业务...

Spring-释放数据传输潜力的数据压缩技术-微服务 (springboot启动)

Spring-释放数据传输潜力的数据压缩技术-微服务 (springboot启动)

简介 随着云原生架构的兴起,微服务已成为可扩展和可维护系统的重要构建块。顾名思义,微服务是小型的、独立的服务,它们共同构成一个完整的系统。当使用微服务构建系统时,尤其是那些具有大量数据交换的系统...

比如每日有大量用户访问和数据替换-服务器的带宽需求与网站的访问量密切相关-那么就须要更大的带宽来满足需求-访问量-假设你的网站流量大 (比如每日有大事的句子)

比如每日有大量用户访问和数据替换-服务器的带宽需求与网站的访问量密切相关-那么就须要更大的带宽来满足需求-访问量-假设你的网站流量大 (比如每日有大事的句子)

SpringBeanDefinition元信息定义形式 BeanDefinition是一个蕴含Bean元数据的对象。它形容了如何创立Bean实例、Bean属性的值以及Bean之间的依赖相关。...

b-b-核心原理拆解与源码分析-2.0-Spring-Boot-深度实践 (核心b类期刊有哪些)

b-b-核心原理拆解与源码分析-2.0-Spring-Boot-深度实践 (核心b类期刊有哪些)

SpringBoot是一个基于Spring的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用程序。随着SpringBoot2.0版本的发布,其功能和性能得...

极致便当与卓越容错-Topic-Spring-重试-成功-运用-Kafka (极致餐是什么意思)

极致便当与卓越容错-Topic-Spring-重试-成功-运用-Kafka (极致餐是什么意思)

概述 Kafka的弱小性能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条信息的值。可以智能或手动参与该值。假设咱们因为失误而不可处置信息并想重试,咱们可以选用...

Boot-Spring-与-3.0-加速应用性能的完美融合-GraalVM (bootstrap)

Boot-Spring-与-3.0-加速应用性能的完美融合-GraalVM (bootstrap)

在 2023 年,SpringBoot 3.0 的发布标志着 Spring 框架对 GraalVM 的全面支持。此支持对 Spring 技术栈来说是一项重大补充。 GraalVM 概述...

Spring-Webflux-Boot-虚构线程性能逊色于-深化比较 (springboot)

Spring-Webflux-Boot-虚构线程性能逊色于-深化比较 (springboot)

早上看到一篇关于SpringBoot虚构线程和Webflux性能对比的文章,感觉还不错。内容较长,抓重点给大家引见一下这篇文章的外围内容,繁难大家极速浏览。 测试场景 作者驳回了一个尽...

揭秘-的暗藏技艺-AOP-从概念到实用场景-Spring (神秘丂丂是什么意思)

揭秘-的暗藏技艺-AOP-从概念到实用场景-Spring (神秘丂丂是什么意思)

环境:Spring5.3.23 1.引见 当天看Spring文档看到这么一个常识点《ControlFlowPointcuts》都不好翻译 官网原文: Springcontr...