我有点困惑。
@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";
}
这两种方法执行相同的工作吗?
答案 0 :(得分:0)
AFAIK,手动设置标头是一种幼稚的方式,即表示允许来自此来源的请求,并且这种方法仅限于这样做。此外,它仅限于设置此标头的API。
另一方面,@CrossOrigin
使您可以灵活地在控制器级别和请求映射级别进行配置。
此外,@CrossOrigin
将设置其他默认值,例如DEFAULT_ALLOWED_HEADERS
,DEFAULT_ALLOW_CREDENTIALS
,DEFAULT_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);
}
}