多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Spring 和 CORS > 原文: [https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/](https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/) **CORS**(跨域资源共享)允许网页从其他域(例如, CDN 中的字体,CSS 或静态图像。 CORS 有助于将来自多个域的 Web 内容提供给通常具有[同源](https://en.wikipedia.org/wiki/Same-origin_policy)安全策略的浏览器。 在此示例中,我们将学习在方法级别和全局级别在 [Spring MVC](https://howtodoinjava.com/spring-mvc-tutorial/) 应用程序中启用**启用 Spring CORS 支持**。 > 阅读更多: [Java CORS 过滤器示例](https://howtodoinjava.com/servlets/java-cors-filter-example/) ## 1\. Spring CORS – `@CrossOrigin`的方法级别 Spring MVC 提供[`@CrossOrigin`](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/CrossOrigin.html)注解。 该注解将注解的方法或类型标记为允许跨源请求。 #### 1.1. Spring CORS 允许所有 默认情况下,`@CrossOrigin`允许所有来源,所有标头,在[`@RequestMapping`](https://howtodoinjava.com/spring5/webmvc/controller-getmapping-postmapping/)注解中指定的[ HTTP 方法](https://restfulapi.net/http-methods/)和`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` ```java @CrossOrigin(origins = "*", allowedHeaders = "*") @Controller public class HomeController { @GetMapping(path="/") public String homeInit(Model model) { return "home"; } } ``` > 阅读更多 – [Spring 5 MVC 示例](https://howtodoinjava.com/spring5/webmvc/spring5-mvc-hibernate5-example/) #### 1.3. 方法级别的`@CrossOrigin` `HomeController.java` ```java @Controller public class HomeController { @CrossOrigin(origins = "*", allowedHeaders = "*") @GetMapping(path="/") public String homeInit(Model model) { return "home"; } } ``` #### 1.4. `@CrossOrigin`的方法级别覆盖 `homeInit()`方法只能从`http://example.com`域访问。 `HomeController`中的其他方法可以从所有域访问。 `HomeController.java` ```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` ```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 应用程序中,建议仅声明一个`WebMvcConfigurer` bean。 `CorsConfiguration.java` ```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](https://howtodoinjava.com/spring-security-tutorial/)启用 CORS 支持,请配置[`CorsConfigurationSource`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/cors/CorsConfigurationSource.html) bean 并使用`HttpSecurity.cors()`配置。 `WebSecurityConfig.java` ```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; } } ``` 将我的问题放在评论部分。 学习愉快! [下载源码](https://github.com/lokeshgupta1981/spring-webmvc)