原文: https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/

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

在此示例中,我们将学习在方法级别和全局级别在 Spring MVC 应用程序中启用启用 Spring CORS 支持

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

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

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

1.1. Spring CORS 允许所有

默认情况下,@CrossOrigin允许所有来源,所有标头,在@RequestMapping注解中指定的 HTTP 方法maxAge为 30 分钟。

您可以通过为注解属性赋值来覆盖默认的 CORS 设置:

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

1.2. 类/控制器级别的@CrossOrigin

HomeController.java

  1. @CrossOrigin(origins = "*", allowedHeaders = "*")
  2. @Controller
  3. public class HomeController
  4. {
  5. @GetMapping(path="/")
  6. public String homeInit(Model model) {
  7. return "home";
  8. }
  9. }

阅读更多 – Spring 5 MVC 示例

1.3. 方法级别的@CrossOrigin

HomeController.java

  1. @Controller
  2. public class HomeController
  3. {
  4. @CrossOrigin(origins = "*", allowedHeaders = "*")
  5. @GetMapping(path="/")
  6. public String homeInit(Model model) {
  7. return "home";
  8. }
  9. }

1.4. @CrossOrigin的方法级别覆盖

homeInit()方法只能从http://example.com域访问。 HomeController中的其他方法可以从所有域访问。

HomeController.java

  1. @Controller
  2. @CrossOrigin(origins = "*", allowedHeaders = "*")
  3. public class HomeController
  4. {
  5. @CrossOrigin(origins = "http://example.com")
  6. @GetMapping(path="/")
  7. public String homeInit(Model model) {
  8. return "home";
  9. }
  10. }

2. Spring CORS – 全局 CORS 配置

2.1. 实现WebMvcConfigurer

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

CorsConfiguration.java

  1. import org.springframework.context.annotation.Configuration;
  2. import org.springframework.web.servlet.config.annotation.CorsRegistry;
  3. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  5. @Configuration
  6. @EnableWebMvc
  7. public class CorsConfiguration implements WebMvcConfigurer
  8. {
  9. @Override
  10. public void addCorsMappings(CorsRegistry registry) {
  11. registry.addMapping("/**")
  12. .allowedMethods("GET", "POST");
  13. }
  14. }

2.2. WebMvcConfigurer Bean

在 Spring Boot 应用程序中,建议仅声明一个WebMvcConfigurer bean。

CorsConfiguration.java

  1. @Configuration
  2. public class CorsConfiguration
  3. {
  4. @Bean
  5. public WebMvcConfigurer corsConfigurer()
  6. {
  7. return new WebMvcConfigurer() {
  8. @Override
  9. public void addCorsMappings(CorsRegistry registry) {
  10. registry.addMapping("/**").allowedOrigins("http://localhost:8080");
  11. }
  12. };
  13. }
  14. }

2.3. Spring Security 的 CORS

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

WebSecurityConfig.java

  1. @EnableWebSecurity
  2. public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  3. @Override
  4. protected void configure(HttpSecurity http) throws Exception {
  5. http.cors().and()
  6. //other config
  7. }
  8. @Bean
  9. CorsConfigurationSource corsConfigurationSource()
  10. {
  11. CorsConfiguration configuration = new CorsConfiguration();
  12. configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
  13. configuration.setAllowedMethods(Arrays.asList("GET","POST"));
  14. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  15. source.registerCorsConfiguration("/**", configuration);
  16. return source;
  17. }
  18. }

将我的问题放在评论部分。

学习愉快!

下载源码