Spring @CrossOrigin 不适用于 DELETE 方法

Wiz*_*eek 7 spring spring-mvc cors http-delete

Spring @CrossOrigin 注释不适用于 DELETE 方法。

示例代码(在 Groovy 中):

@CrossOrigin
@RestController
@RequestMapping('/rest')
class SpringController {

    @RequestMapping(value = '/{fileName}', RequestMethod.DELETE)
    void deleteFile(@PathVariable fileName) {
        // logic
    }

}
Run Code Online (Sandbox Code Playgroud)

对于这段代码,我得到了异常:

XMLHttpRequest 无法加载http://localhost:8080/rest/filename.txt。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问Origin ' http://localhost:4200 '。响应具有 HTTP 状态代码 404。

笔记:

  • 我在 Chrome 58 和 Postman 4.10.7 中测试过
  • 根据https://spring.io/guides/gs/rest-service-cors/默认情况下,@CrossOrigin 只允许 GET、HEAD 和 POST 跨域请求。虽然指定@CrossOrigin(methods = [RequestMethod.GET, RequestMethod.DELETE])没有帮助
  • 为简洁起见,我省略了一些代码。实际控制器也有相同映射的 GET 请求,delete 方法有返回类型并产生 JSON 响应,以及我认为不会影响问题的其他小东西。

Kal*_*van 0

@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
  @Override
  public void addCorsMappings(CorsRegistry registry) {
      registry.addMapping("your cross origin url")
            .allowedOrigins("your cross origin host/url")
            .allowedHeaders("Access-Control-Allow-Origin", "*")
            .allowedHeaders("Access-Control-Allow-Headers", "Content-Type,x-requested-with").maxAge(20000)
            .allowCredentials(false)
            .allowedMethods("DELETE");
 }
}

// in your controller
@RequestMapping(value = '/{fileName:.+}', RequestMethod.DELETE)
void deleteFile(@PathVariable fileName) {
    // your custom logic
}
Run Code Online (Sandbox Code Playgroud)