CrossOrigin批注和setHeader可以做同样的事情吗?

时间:2020-10-05 11:50:28

标签: java spring cors

我有点困惑。

@GetMapping
@CrossOrigin(origins = "http://localhost:8107")
public String getSomeText(){
   return "Hello world";
}

@GetMapping
public String getSomeText(HttpServletResponse response){
    response.setHeader("Access-Control-Allow-Origin","http://localhost:8107");
    return "Hello world";
}

这两种方法执行相同的工作吗?

1 个答案:

答案 0 :(得分:0)

AFAIK,手动设置标头是一种幼稚的方式,即表示允许来自此来源的请求,并且这种方法仅限于这样做。此外,它仅限于设置此标头的API。

另一方面,@CrossOrigin使您可以灵活地在控制器级别和请求映射级别进行配置。

此外,@CrossOrigin将设置其他默认值,例如DEFAULT_ALLOWED_HEADERSDEFAULT_ALLOW_CREDENTIALSDEFAULT_MAX_AGE

手动设置标题可能并不总是有效,因为会有很多过滤器可以覆盖您在控制器中设置的值。

所以我不建议同时使用这两种方法。配置一个CORS config bean,并在那里进行配置。一个例子如下:

@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(Collections.singletonList("http://localhost:4200"));
        config.setAllowedHeaders(Arrays.asList("Origin", "Content-Type", "Accept"));
        config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
        config.setAllowCredentials(true);
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}