原文: 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
@CrossOrigin(origins = "*", allowedHeaders = "*")@Controllerpublic class HomeController{@GetMapping(path="/")public String homeInit(Model model) {return "home";}}
阅读更多 – Spring 5 MVC 示例
1.3. 方法级别的@CrossOrigin
HomeController.java
@Controllerpublic class HomeController{@CrossOrigin(origins = "*", allowedHeaders = "*")@GetMapping(path="/")public String homeInit(Model model) {return "home";}}
1.4. @CrossOrigin的方法级别覆盖
homeInit()方法只能从http://example.com域访问。 HomeController中的其他方法可以从所有域访问。
HomeController.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@EnableWebMvcpublic class CorsConfiguration implements WebMvcConfigurer{@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedMethods("GET", "POST");}}
2.2. WebMvcConfigurer Bean
在 Spring Boot 应用程序中,建议仅声明一个WebMvcConfigurer bean。
CorsConfiguration.java
@Configurationpublic class CorsConfiguration{@Beanpublic WebMvcConfigurer corsConfigurer(){return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("http://localhost:8080");}};}}
2.3. Spring Security 的 CORS
要通过 Spring Security启用 CORS 支持,请配置CorsConfigurationSource bean 并使用HttpSecurity.cors()配置。
WebSecurityConfig.java
@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.cors().and()//other config}@BeanCorsConfigurationSource 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;}}
将我的问题放在评论部分。
学习愉快!
