Spring Boot 的 CORS

CORS跨域资源共享)允许网页从其他域向浏览器请求额外的资源,例如来自 CDN 的字体、CSS 或静态图像。CORS 有助于将来自多个域的 Web 内容提供给通常具有同源安全策略的浏览器。

学习在方法级别和全局级别在Spring MVC应用程序中启用 Spring CORS 支持。

阅读更多:Java CORS 过滤器示例

目录

1.带有@CrossOrigin的方法级别CORS 
2.全局CORS配置

1. Spring CORS – 使用@CrossOrigin 的方法级别

Spring MVC 提供@CrossOrigin注解。此注解将注解的方法或类型标记为允许跨源请求。

1.1。默认为全部允许

默认情况下,@CrossOrigin允许所有源、所有标头、注释中指定的HTTP 方法和30 分钟。@RequestMappingmaxAge

我们可以通过赋予注释属性值来覆盖默认的 CORS 设置:

属性
描述
origins
允许的来源列表。它的值放置在Access-Control-Allow-Origin飞行前响应和实际响应的标头中。
"*" – 表示允许所有来源。如果undefined,则允许所有来源。
allowedHeaders
可以在实际请求期间使用的请求标头列表。值用于预检的响应标头Access-Control-Allow-Headers中。
"*" – 表示允许客户端请求的所有标头。如果undefined,则允许所有请求的标头。
methods
支持的 HTTP 请求方法列表。如果未定义,RequestMapping则使用注释定义的方法。
exposedHeaders
浏览器将允许客户端访问的响应标头列表。值在实际响应标头中设置Access-Control-Expose-Headers。如果undefined,则使用空的公开标头列表。
allowCredentials
它确定浏览器是否应包含与请求关联的任何 cookie。
  • false – 不应包括 cookie。
  • " "(空字符串)——表示未定义
  • true– 飞行前响应将包括Access-Control-Allow-Credentials值设置为 true 的标头。
  • 如果undefined,则允许凭据。
maxAge
飞行前响应的缓存持续时间的最长期限(以秒为单位)。值在 header 中设置Access-Control-Max-Age
如果undefined,则最大年龄设置为 1800 秒(30 分钟)。

1.2. @CrossOrigin 在类或控制器级别

家庭控制器.java
@CrossOrigin(origins = "*", allowedHeaders = "*")
@Controller
public class HomeController
{
    @GetMapping(path="/")
    public String homeInit(Model model) {
        return "home";
    }
}

阅读更多——Spring 5 MVC 示例

1.3. 方法级别的@CrossOrigin

家庭控制器.java
@Controller
public class HomeController
{
    @CrossOrigin(origins = "*", allowedHeaders = "*")
    @GetMapping(path="/")
    public String homeInit(Model model) {
        return "home";
    }
}

1.4. @CrossOrigin 在方法级别被覆盖

homeInit()方法只能从 domain 访问http://example.comHomeController所有域都可以访问其他方法。

家庭控制器.java
@Controller
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class HomeController
{
    @CrossOrigin(origins = "http://example.com" )
    @GetMapping(path="/")
    public String homeInit(Model model) {
        return "home";
    }
}

2. Spring CORS——全局CORS配置

2.1。实现 WebMvcConfigurer

要为整个应用程序启用 CORS,请使用WebMvcConfigurer添加CorsRegistry.

CorsConfiguration.java
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@Configuration
@EnableWebMvc
public class CorsConfiguration implements WebMvcConfigurer
{
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("GET", "POST");
    }
}

2.2. WebMvcConfigurer Bean

在 Spring Boot 应用程序中,建议只声明一个WebMvcConfigurerbean。

CorsConfiguration.java
@Configuration
public class CorsConfiguration
{
    @Bean
    public WebMvcConfigurer corsConfigurer()
    {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins( "http://localhost:8080" );
            }
        };
    }
}

2.3. 带有 Spring Security 的 CORS

要通过Spring security启用 CORS 支持,请配置CorsConfigurationSourcebean 并使用HttpSecurity.cors()配置。

WebSecurityConfig.java
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()
            //other config
    }
 
    @Bean
    CorsConfigurationSource corsConfigurationSource()
    {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList( "https://example.com" ));
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

在评论部分给我你的问题。

快乐学习!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值