searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Spring CORS 配置

2023-05-29 03:09:51
10
0

CORS 概述

跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。

跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。

在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。

接下来的内容将讨论如何在 Spring 框架中配置跨域资源共享,包括本地类方法注解配置以及全局配置。

CORS 配置

@CrossOrigin

@CrossOrigin 应用于 Controller 类或者成员方法。

@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

   @RequestMapping(method = RequestMethod.GET, path = "/{id}")
   public Account retrieve(@PathVariable Long id) {
       // ...
  }

   @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
   public void remove(@PathVariable Long id) {
       // ...
  }
}

由于该注解触发时机晚于过滤器、拦截器,不能保证存在其他过滤器、拦截器时,这里的 CORS 逻辑一定被执行,所以不推荐使用这种方式进行配置,建议使用全局配置。

全局配置

CorsConfiguration 允许指定如何处理 CORS 请求:允许的请求源、请求头和请求方法等。

方式一、重写 CorsFilter
@Configuration
public class GlobalCorsConfig {
   @Bean
   public CorsFilter corsFilter() {
       // 1.添加CORS配置信息
       CorsConfiguration config = new CorsConfiguration();
         // 放行哪些原始域
         config.addAllowedOrigin("*");
         // 是否发送Cookie信息
         config.setAllowCredentials(true);
         // 放行哪些原始域(请求方式)
         config.addAllowedMethod("*");
         // 放行哪些原始域(头部信息)
         config.addAllowedHeader("*");
         // 暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
         config.addExposedHeader("*");

       //2.添加映射路径
       UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
       configSource.registerCorsConfiguration("/**", config);

       //3.返回新的CorsFilter.
       return new CorsFilter(configSource);
  }

   @Bean
   public FilterRegistrationBean<CorsFilter> corsFilterBean(CorsFilter corsFilter) {
       FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(corsFilter);
       // 需要确保 CORS 过滤器在其他过滤器之前执行
       bean.setOrder(0);
       return bean;
  }
}
方式二、重写 WebMvcConfigurer
@SpringBootApplication
public class RestServiceCorsApplication {

public static void main(String[] args) {
SpringApplication.run(RestServiceCorsApplication.class, args);
}

@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry
        .addMapping("/test")
        .allowedOrigins("http://localhost:9000");
}
};
}
}
0条评论
作者已关闭评论
萧****秀
5文章数
0粉丝数
萧****秀
5 文章 | 0 粉丝
萧****秀
5文章数
0粉丝数
萧****秀
5 文章 | 0 粉丝
原创

Spring CORS 配置

2023-05-29 03:09:51
10
0

CORS 概述

跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。

跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。

在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。

接下来的内容将讨论如何在 Spring 框架中配置跨域资源共享,包括本地类方法注解配置以及全局配置。

CORS 配置

@CrossOrigin

@CrossOrigin 应用于 Controller 类或者成员方法。

@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

   @RequestMapping(method = RequestMethod.GET, path = "/{id}")
   public Account retrieve(@PathVariable Long id) {
       // ...
  }

   @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
   public void remove(@PathVariable Long id) {
       // ...
  }
}

由于该注解触发时机晚于过滤器、拦截器,不能保证存在其他过滤器、拦截器时,这里的 CORS 逻辑一定被执行,所以不推荐使用这种方式进行配置,建议使用全局配置。

全局配置

CorsConfiguration 允许指定如何处理 CORS 请求:允许的请求源、请求头和请求方法等。

方式一、重写 CorsFilter
@Configuration
public class GlobalCorsConfig {
   @Bean
   public CorsFilter corsFilter() {
       // 1.添加CORS配置信息
       CorsConfiguration config = new CorsConfiguration();
         // 放行哪些原始域
         config.addAllowedOrigin("*");
         // 是否发送Cookie信息
         config.setAllowCredentials(true);
         // 放行哪些原始域(请求方式)
         config.addAllowedMethod("*");
         // 放行哪些原始域(头部信息)
         config.addAllowedHeader("*");
         // 暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
         config.addExposedHeader("*");

       //2.添加映射路径
       UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
       configSource.registerCorsConfiguration("/**", config);

       //3.返回新的CorsFilter.
       return new CorsFilter(configSource);
  }

   @Bean
   public FilterRegistrationBean<CorsFilter> corsFilterBean(CorsFilter corsFilter) {
       FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(corsFilter);
       // 需要确保 CORS 过滤器在其他过滤器之前执行
       bean.setOrder(0);
       return bean;
  }
}
方式二、重写 WebMvcConfigurer
@SpringBootApplication
public class RestServiceCorsApplication {

public static void main(String[] args) {
SpringApplication.run(RestServiceCorsApplication.class, args);
}

@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry
        .addMapping("/test")
        .allowedOrigins("http://localhost:9000");
}
};
}
}
文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0