CORS(跨域资源共享)允许网页从其他域向浏览器请求额外的资源,例如来自 CDN 的字体、CSS 或静态图像。CORS 有助于将来自多个域的 Web 内容提供给通常具有同源安全策略的浏览器。
学习在方法级别和全局级别在Spring MVC应用程序中启用 Spring CORS 支持。
阅读更多:Java CORS 过滤器示例
目录 1.带有@CrossOrigin的方法级别CORS 2.全局CORS配置
1. Spring CORS – 使用@CrossOrigin 的方法级别
Spring MVC 提供@CrossOrigin
注解。此注解将注解的方法或类型标记为允许跨源请求。
1.1。默认为全部允许
默认情况下,@CrossOrigin允许所有源、所有标头、注释中指定的HTTP 方法和30 分钟。@RequestMapping
maxAge
我们可以通过赋予注释属性值来覆盖默认的 CORS 设置:
属性
|
描述
|
---|---|
origins
|
允许的来源列表。它的值放置在 Access-Control-Allow-Origin 飞行前响应和实际响应的标头中。"*" – 表示允许所有来源。如果undefined ,则允许所有来源。
|
allowedHeaders
|
可以在实际请求期间使用的请求标头列表。值用于预检的响应标头 Access-Control-Allow-Headers 中。"*" – 表示允许客户端请求的所有标头。如果undefined ,则允许所有请求的标头。
|
methods
|
支持的 HTTP 请求方法列表。如果未定义, RequestMapping 则使用注释定义的方法。
|
exposedHeaders
|
浏览器将允许客户端访问的响应标头列表。值在实际响应标头中设置 Access-Control-Expose-Headers 。如果undefined ,则使用空的公开标头列表。
|
allowCredentials
|
它确定浏览器是否应包含与请求关联的任何 cookie。
|
maxAge
|
飞行前响应的缓存持续时间的最长期限(以秒为单位)。值在 header 中设置 Access-Control-Max-Age 。如果 undefined ,则最大年龄设置为 1800 秒(30 分钟)。
|
1.2. @CrossOrigin 在类或控制器级别
@CrossOrigin(origins = "*" , allowedHeaders = "*")
@Controller
public class HomeController
{
@GetMapping (path= "/")
public String homeInit(Model model) {
return "home";
}
}
|
1.3. 方法级别的@CrossOrigin
@Controller
public class HomeController
{
@CrossOrigin (origins = "*" , allowedHeaders = "*")
@GetMapping (path= "/")
public String homeInit(Model model) {
return "home";
}
}
|
1.4. @CrossOrigin 在方法级别被覆盖
homeInit()
方法只能从 domain 访问http://example.com
。HomeController
所有域都可以访问其他方法。
@Controller
@CrossOrigin(origins = "*" , allowedHeaders = "*")
public class HomeController
{
@GetMapping (path= "/")
public String homeInit(Model model) {
return "home";
}
}
|
2. Spring CORS——全局CORS配置
2.1。实现 WebMvcConfigurer
要为整个应用程序启用 CORS,请使用WebMvcConfigurer
添加CorsRegistry
.
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。
@Configuration
public class CorsConfiguration
{
@Bean
public WebMvcConfigurer corsConfigurer()
{
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
}
};
}
}
|
2.3. 带有 Spring Security 的 CORS
要通过Spring security启用 CORS 支持,请配置CorsConfigurationSource
bean 并使用HttpSecurity.cors()
配置。
@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.setAllowedMethods(Arrays.asList( "GET" , "POST"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration( "/**", configuration);
return source;
}
}
|
在评论部分给我你的问题。
快乐学习!!