原文: 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 = "*")
@Controller
public class HomeController
{
@GetMapping(path="/")
public String homeInit(Model model) {
return "home";
}
}
阅读更多 – Spring 5 MVC 示例
1.3. 方法级别的@CrossOrigin
HomeController.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
@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 应用程序中,建议仅声明一个WebMvcConfigurer
bean。
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 支持,请配置CorsConfigurationSource
bean 并使用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;
}
}
将我的问题放在评论部分。
学习愉快!