Spring 里多种 CORS 配置方式

参考:https://cloud.tencent.com/developer/article/1703212
https://cloud.tencent.com/developer/article/1513473

一、CORS 介绍

CORS全称是Cross-Origin Resource Sharing,直译过来就是跨域资源共享。

  • 从站点 A 请求站点 B 的资源的时候,由于浏览器的同源策略的影响,这样的跨域请求将被禁止发送;为了让跨域请求能够正常发送,我们需要一套机制在不破坏同源策略的安全性的情况下、允许跨域请求正常发送,这样的机制就是CORS
  • 要理解域、资源和同源策略这三个概念
    :指的是一个站点,由protocal、host和port三部分组成,其中host可以是域名,也可以是ip;port如果没有指明,则是使用protocal的默认端口
    资源:是指一个URL对应的内容,可以是一张图片、一种字体、一段HTML代码、一份JSON数据等等任何形式的任何内容
    同源策略:指的是为了防止XSS,浏览器、客户端应该仅请求与当前页面来自同一个域的资源,请求其他域的资源需要通过验证。
  • 当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域

二、预检请求——OPTIONS

跨域请求流程:
1.访问另一个域的资源
2.有可能会发起一次预检请求(非简单请求,或超过了Max-Age)
3.发起实际请求

  • 在CORS中,定义了一种预检请求,即preflight request,当实际请求不是一个简单请求时,会发起一次预检请求。预检请求是针对实际请求的 URL 发起一次OPTIONS请求,并带上下面三个headers:
    Origin:值为当前页面所在的域,用于告诉服务器当前请求的域。如果没有这个header,服务器将不会进行CORS验证。
    Access-Control-Request-Method:值为实际请求将会使用的方法
    Access-Control-Request-Headers:值为实际请求将会使用的header集合
  • 如果服务器端CORS验证失败,则会返回客户端错误,即4xx的状态码。
  • 否则,将会请求成功,返回200的状态码,并带上下面这些headers:
    Access-Control-Allow-Origin:允许请求的域,多数情况下,就是预检请求中的Origin的值
    Access-Control-Allow-Credentials:一个布尔值,表示服务器是否允许使用cookies
    Access-Control-Expose-Headers:实际请求中可以出现在响应中的headers集合
    Access-Control-Max-Age:预检请求返回的规则可以被缓存的最长时间,超过这个时间,需要再次发起预检请求
    Access-Control-Allow-Methods:实际请求中可以使用到的方法集合
  • 浏览器会根据预检请求的响应,来决定是否发起实际请求。

三、CORS 配置的方式

Spring 提供了多种配置CORS的方式,有的方式针对单个 API,有的方式可以针对整个应用;有的方式在一些情况下是等效的,而在另一些情况下却又出现不同。
在仅仅引入Spring Web的情况下,实现3.2 3.4这两种方式它们的区别会在引入Spring Security之后会展现出来

  • 假设我们有一个 API:
    @RestController
    class HelloController {
         
        @GetMapping("hello")
        fun hello(): String {
         
            return "Hello, CORS!"
        }
    }
    

3.1 @CrossOrigin注解

用@CorssOrigin注解需要引入Spring Web的依赖,该注解可以作用于方法或者类,可以针对这个方法或类对应的一个或多个 API 配置CORS规则:

@RestController
class HelloController {
   
    @GetMapping("hello"
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Security中配置跨域有多种方法。一种常见的方法是使用@CrossOrigin注解或重写addCorsMappings方法来配置跨域,但是当项目中引入了Spring Security依赖后,这种配置方式可能会失效。 为了解决这个问题,可以使用Spring Security提供的更专业的跨域方案。首先,需要创建一个继承自WebSecurityConfigurerAdapter的配置类,并重写configure方法。在configure方法中,可以通过调用HttpSecurity对象的cors方法来启用跨域配置。 在cors方法中,可以通过CorsConfigurationSource对象的configurationSource方法来配置具体的跨域设置。可以使用CorsConfiguration对象来设置允许的请求头、请求方法和请求来源。此外,还可以设置预检请求的缓存时间。最后,需要将CorsConfiguration对象注册到UrlBasedCorsConfigurationSource对象中。 下面是一个示例的配置类的代码: ```java @Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .mvcMatchers("/hello1").permitAll() .anyRequest().authenticated() .and() .formLogin() .and() .cors() // 跨域配置 .configurationSource(configurationSource()); } CorsConfigurationSource configurationSource() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowedHeaders(Collections.singletonList("*")); corsConfiguration.setAllowedMethods(Collections.singletonList("*")); corsConfiguration.setAllowedOrigins(Collections.singletonList("*")); corsConfiguration.setMaxAge(3600L); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfiguration); return source; } } ``` 通过以上配置Spring Security会自动应用跨域配置,并且保持其他安全配置不受影响。这种方式可以确保跨域配置Spring Security过滤器之前生效,避免了跨域配置失效的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Security(七) ——跨域配置](https://blog.csdn.net/tongkongyu/article/details/125982927)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值