美文网首页
Spring项目支持CORS的几种方式

Spring项目支持CORS的几种方式

作者: CK110 | 来源:发表于2017-05-17 17:41 被阅读1463次

    Spring Framework 4.2 GA为开箱即用的CORS提供了一流的支持,为您提供了比典型的基于过滤器的解决方案更简单,更强大的配置方式。

    Controller方法上增加CORS配置

    @RestController
    @RequestMapping("/account")
    public class AccountController {
    
        + @CrossOrigin
        @RequestMapping("/{id}")
        public Account retrieve(@PathVariable Long id) {
            // ...
        }
    
        @RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
        public void remove(@PathVariable Long id) {
            // ...
        }
    }
    

    在controller上配置

    + @CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
    @RestController
    @RequestMapping("/account")
    public class AccountController {
    
        @RequestMapping("/{id}")
        public Account retrieve(@PathVariable Long id) {
            // ...
        }
    
        @RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
        public void remove(@PathVariable Long id) {
            // ...
        }
    }
    

    或者混合配置

    + @CrossOrigin(maxAge = 3600)
    @RestController
    @RequestMapping("/account")
    public class AccountController {
    
        + @CrossOrigin(origins = "http://domain2.com")
        @RequestMapping("/{id}")
        public Account retrieve(@PathVariable Long id) {
            // ...
        }
    
        @RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
        public void remove(@PathVariable Long id) {
            // ...
        }
    }
    

    全局配置

    使用Java配置

    整个应用都支持CORS

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**");
        }
    }
    
    

    更详细的配置,具体到某个API路径

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @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);
        }
    }
    

    使用XML配置

    整个应用都支持CORS

    <mvc:cors>
        <mvc:mapping path="/**" />
    </mvc:cors>
    

    更详细的配置,具体到某个API路径

    <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 Boot的配置方式

    Spring Boot 1.3 版本支持CORS

    在SpringBoot应用程序中使用带有@CrossOrigin注解的 controller方法,不需要任何特定的配置。

    全局配置的方式:

    @Configuration
    public class MyConfiguration {
    
        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurerAdapter() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/api/**");
                }
            };
        }
    }
    

    Filter based CORS support

    为了支持具有基于过滤器的安全框架(如Spring Security)的CORS,或者与其他不支持本机CORS的项目(如Spring Data REST)一起,我们还提供了一个CorsFilter。在这种情况下,不用使用@CrossOrigin或WebMvcConfigurer#addCorsMappings(CorsRegistry),您可以在Spring Boot应用程序中声明如下所示的过滤器:

    @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;
        }
    }
    

    参考

    相关文章

      网友评论

          本文标题:Spring项目支持CORS的几种方式

          本文链接:https://www.haomeiwen.com/subject/wrodxxtx.html