控制器方法CORS配置
注释处理程序方法添加
- @RequestMapping
注释,以便启用CORS(默认情况下
- @CrossOrigin
允许
- @CrossOrigin
注释中指定的所有起始和
- @RequestMapping
方法):
- HTTP
}
- @RestController
- @RequestMapping("/account")
- public class AccountController {
- @CrossOrigin
- @GetMapping("/{id}")
- public Account retrieve(@PathVariable Long id) {
- // ...
- }
- @DeleteMapping("/{id}")
- public void remove(@PathVariable Long id) {
- // ...
- }
- @CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
- @RestController
- @RequestMapping("/account")
- public class AccountController {
- @GetMapping("/{id}")
- public Account retrieve(@PathVariable Long id) {
- // ...
- }
- @DeleteMapping("/{id}")
- public void remove(@PathVariable Long id) {
- // ...
- }
- }
在此示例中,对于这两种方法
和
- retrieve()
处理程序方法都启用了CORS支持,还可以看到如何使用
- remove()
属性自定义CORS配置。
- @CrossOrigin
您甚至可以同时使用控制器和方法级CORS配置,然后Spring将组合两个注释属性来创建合并的CORS配置。
- @CrossOrigin(maxAge = 3600)
- @RestController
- @RequestMapping("/account")
- public class AccountController {
- @CrossOrigin(origins = "http://domain2.com")
- @GetMapping("/{id}")
- public Account retrieve(@PathVariable Long id) {
- // ...
- }
- @DeleteMapping("/{id}")
- public void remove(@PathVariable Long id) {
- // ...
- }
- }
如果您使用Spring Security,请确保在Spring Security级别启用CORS,并允许它利用Spring MVC级别定义的配置。
- @EnablewebSecurity
- public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- http.cors().and()...
- }
- }
除了细粒度的基于注释的配置,您也可能想要定义一些全局CORS配置。这与使用过滤器类似,但可以使用Spring MVC声明并结合细粒度
配置。默认情况下,所有的起源和
- @CrossOrigin
,
- GET
和
- HEAD
方法都是允许的。
- POST
为整个应用程序启用CORS类似于
- @Configuration
- @EnableWebMvc
- public class WebConfig extends WebMvcConfigurerAdapter {
- @Override
- public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/**");
- }
- }
如果您使用的是Spring Boot,建议只要声明一个
bean如下:
- WebMvcConfigurer
- @Configuration
- public class MyConfiguration {
- @Bean
- public WebMvcConfigurer corsConfigurer() {
- return new WebMvcConfigurerAdapter() {
- @Override
- public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/**");
- }
- };
- }
- }
您可以轻松地更改任何属性,以及仅将此CORS配置应用于特定路径模式:
- @Override
- public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/api/**")
- .allowedOrigins("http://domain2.com")
- .allowedMethods("PUT", "DELETE")
- .allowedHeaders("header1", "header2", "header3")
- .exposedHeaders("header1", "header2")
- .allowCredentials(false).maxAge(3600);
- }
如果您使用Spring Security,请确保在Spring Security级别启用CORS,并允许它利用Spring MVC级别定义的配置。
也可以使用mvc XML命名空间配置CORS 。
这种最小的XML配置使得
路径模式上的CORS 具有与JavaConfig相同的默认属性:
- /**
- <mvc:cors>
- <mvc:mapping path="/**" />
- </mvc:cors>
也可以使用自定义属性声明几个CORS映射:
- <mvc:cors>
- <mvc:mapping path="/api/**"
- allowed-origins="http://domain1.com, http://domain2.com"
- allowed-methods="GET, PUT"
- allowed-headers="header1, header2, header3"
- exposed-headers="header1, header2" allow-credentials="false"
- max-age="123" />
- <mvc:mapping path="/resources/**"
- allowed-origins="http://domain1.com" />
- </mvc:cors>
如果您使用
,请不要忘记在Spring Security级别启用CORS:
- Spring Security
- <http>
- <!-- Default to Spring MVC's CORS configuration -->
- <cors />
- ...
- </http>
CORS请求(包括带有OPTIONS方法的预检)请求被自动发送到已
注册的各种。他们处理CORS预检要求和拦截CORS简单而实际的请求得益于 CorsProcessor实现(DefaultCorsProcessor以添加相关CORS响应头(如默认情况下)
- HandlerMapping
)。 CorsConfiguration允许您指定如何处理CORS请求:允许的起点,头,方法等。它可以以各种方式提供:
- Access-Control-Allow-Origin
允许在路径模式上映射
- AbstractHandlerMapping#setCorsConfiguration()
几个CorsConfiguration来指定一个
- Map
- /api/**
通过重写
- CorsConfiguration
方法提供自己的子类
- AbstractHandlerMapping#getCorsConfiguration(Object, HttpServletRequest)
接口(像
- CorsConfigurationSource
现在这样),以便为每个请求提供CorsConfiguration。
- ResourceHttpRequestHandler
作为上述其他方法的替代方法,
还提供了一个CorsFilter。在这种情况下,而不是使用
- Spring Framework
或者
- @CrossOrigin
您可以例如在Spring Boot应用程序中声明过滤器如下:
- WebMvcConfigurer#addCorsMappings(CorsRegistry)
- @Configuration
- public class MyConfiguration {
- @Bean
- public FilterRegistrationBean corsFilter() {
- UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
- CorsConfiguration config = new CorsConfiguration();
- config.setAllowCredentials(true);
- config.addAllowedOrigin("http://domain1.com");
- config.addAllowedHeader("*");
- config.addAllowedMethod("*");
- source.registerCorsConfiguration("/**", config);
- FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
- bean.setOrder(0);
- return bean;
- }
- }
来源: https://juejin.im/entry/5a051fd1f265da432d278e5a