基本介绍

简单来说,CORS是一种访问机制,英文全称是Cross-Origin Resource Sharing,即我们常说的跨域资源共享,通过在服务器端设置响应头,把发起跨域的原始域名添加到Access-Control-Allow-Origin 即可。
注:CorsFilter / WebMvcConfigurer / @CrossOrigin 需要SpringMVC 4.2 以上的版本才支持,对应SpringBoot 1.3 版本以上都支持这些CORS特性。不过,使用SpringMVC4.2 以下版本的小伙伴也不用慌,直接使用方式4通过手工添加响应头来授权CORS跨域访问也是可以的。附:在SpringBoot 1.2.8 + SpringMVC 4.1.9 亲测成功。

解决方案一(单一跨域)

  1. 使用@CrossOrigin注解
  2. 其中@CrossOrigin中的2个参数:
  3. origins 允许可访问的域列表
  4. maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。
  5. 在一般性的配置中,在controller前添加@CrossOrigin即可使用spring的默认配置,允许跨域
  6. 该注解也可以配置一些设定,适合针对个别的controller
  7. 例如:
  8. //加到类上
  9. @CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
  10. @RestController
  11. @RequestMapping("/account")
  12. public class AccountController {
  13. @GetMapping("/{id}")
  14. public Account retrieve(@PathVariable Long id) {
  15. // ...
  16. }
  17. @DeleteMapping("/{id}")
  18. public void remove(@PathVariable Long id) {
  19. // ...
  20. }
  21. }
  22. //加到方法上
  23. @RestController
  24. @RequestMapping("/account")
  25. public class AccountController {
  26. @CrossOrigin
  27. @GetMapping("/{id}")
  28. public Account retrieve(@PathVariable Long id) {
  29. // ...
  30. }
  31. @DeleteMapping("/{id}")
  32. public void remove(@PathVariable Long id) {
  33. // ...
  34. }
  35. }

解决方案二(全局跨域)

@Configuration
public class CorsConfig {

    private CorsConfiguration buildConfig() {
      //1.添加CORS配置信息
        CorsConfiguration corsConfiguration = new CorsConfiguration();
    //放行哪些原始域
        corsConfiguration.addAllowedOrigin("*"); // 允许任何域名使用
    //是否发送Cookie信息
        config.setAllowCredentials(true);
    //放行哪些原始域(头部信息)
        corsConfiguration.addAllowedHeader("*"); // 允许任何头
    //放行哪些原始域(请求方式)
        corsConfiguration.addAllowedMethod("*"); // 允许任何方法(post、get等)
    //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
        config.addExposedHeader("*");

        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
}