引言

    在Java 编程中,web项目还是经常遇到一些跨域的使用。这里主要记录几种spring框架,spring boot中的一些常见的几种配置跨域的方法。

    CORS(Cross-origin resource sharing-跨源资源共享)允许网页从其他域向浏览器请求额外的资源,例如 字体,CSS或来自CDN的静态图像。 CORS有助于将来自多个域的网页内容提供给通常具有相同安全策略的浏览器。 在这个例子中,我们将学习如何在Spring MVC应用程序的方法和全局级别启用CORS支持。

一.spring框架中使用@CrossOrigin注解方法级CORS

    Spring MVC提供了@CrossOrigin注解。 这个注释标注了注释的方法或类型,允许跨源请求。

    默认情况下,@CrossOrigin允许所有的来源,所有的头文件,@RequestMapping注解中指定的HTTP方法和30分钟的maxAge。 您可以覆盖这些赋予注释属性值的设置:
 
属性 说明
origins 允许的来源列表. 他的值放置在HTTP协议的响应header的Access-Control-Allow-Origin .
– – 意味着所有的源都是被允许的。
– 如果未定义,则允许所有来源。
allowedHeaders 实际请求期间可以使用的请求标头列表. 值用于预检的响应header Access-Control-Allow-Headers。
– – 意味着允许客户端请求的所有头文件。
– 如果未定义,则允许所有请求的headers。
methods 支持的HTTP请求方法列表。 如果未定义,则使用由RequestMapping注释定义的方法。
exposedHeaders 浏览器允许客户端访问的响应头列表。 在实际响应报头Access-Control-Expose-Headers中设置值。
– 如果未定义,则使用空的暴露标题列表。
allowCredentials 它确定浏览器是否应该包含与请求相关的任何cookie。
– false – cookies 不应该包括在内。
– "" (空字符串) – 意味着未定义.
– true – 预响应将包括值设置为true的报头Access-Control-Allow-Credentials。
– 如果未定义,则允许所有凭据。
maxAge 预响应的高速缓存持续时间的最大时间(以秒为单位)。 值在标题Access-Control-Max-Age中设置。
– 如果未定义, 最大时间设置为1800秒(30分钟).

1.1@CrossOrigin Class/Controller Level

@CrossOrigin(origins = "*", allowedHeaders = "*")
@Controller
public class HomeController
{
    @GetMapping(path="/")
    public String homeInit(Model model) {
        return "home";
    }
}

1.2@CrossOrigin at Method Level

@Controller
public class HomeController
{
    @CrossOrigin(origins = "*", allowedHeaders = "*")
    @GetMapping(path="/")
    public String homeInit(Model model) {
        return "home";
    }
}

1.3 @CrossOrigin Overridden at Method Level

homeInit()方法只能从域http://example.com访问。 其他方法在HomeController中将可以从所有域访问。
@Controller
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class HomeController
{
    @CrossOrigin(origins = "http://example.com")
    @GetMapping(path="/")
    public String homeInit(Model model) {
        return "home";
    }
}

二.Spring框架全局CORS 配置

2.1Spring MVC CORS 使用WebMvcConfigurerAdapter配置

要为整个应用程序启用CORS,请使用WebMvcConfigurerAdapter 添加 CorsRegistry
@Configuration
@EnableWebMvc
public class CorsConfiguration extends WebMvcConfigurerAdapter
{
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("GET", "POST");
    }
}

2.2Spring Boot CORS 使用WebMvcConfigurer配置

在spring boot应用程序中,建议只声明一个WebMvcConfigurer bean。
@Configuration
public class CorsConfiguration
{
    @Bean
    public WebMvcConfigurer corsConfigurer()
    {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}

2.3CORS 使用Spring Security配置

要通过Spring安全性启用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.setAllowedOrigins(Arrays.asList("https://example.com"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}