我正在使用Spring运行服务,而我的Angular前端在尝试发出POST请求时收到请求方法:OPTIONS 403。
Spring服务和Angular应用都在我的机器上本地运行。我尝试使用Chrome插件切换CORS,但这似乎无法解决问题。
我对服务的所有GET请求似乎都可以正常工作。我可以在Postman中执行POST请求,所以我不确定为什么角度应用程序不能发出请求,而Postman可以。
*编辑*
响应标题
Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH Content-Length: 20 Date: Sat, 31 Mar 2018 19:15:01 GMT
请求标题
Accept: */* Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.9 Access-Control-Request-Headers: content-type Access-Control-Request-Method: POST Connection: keep-alive Host: localhost:9901 Origin: http://localhost:4200 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36
您的前端发出了CORS请求,以查看HTTP Verbs您支持的方法()是什么。这通常是货币操作所必需的,例如POST或PUT用于修改数据。
HTTP Verbs
POST
PUT
因此,您的前端将首先进行此调用,而后端需要使用允许的方法进行响应,您还可以限制特定的URI,然后在成功验证后进行目标调用。
这是完全正常的,角度在内部执行此操作,以便在不知道服务器是否允许的情况下不会发出不必要的数据请求。
这是您将在中进行设置的方法Spring。
Spring
//Change/Customize as necessary @Bean CorsConfigurationSource corsConfigurationSource() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("<your origin>"); corsConfiguration.setAllowedMethods(Arrays.asList( HttpMethod.GET.name(), HttpMethod.HEAD.name(), HttpMethod.POST.name(), HttpMethod.PUT.name(), HttpMethod.DELETE.name())); corsConfiguration.setMaxAge(1800L); source.registerCorsConfiguration("/**", corsConfiguration); // you restrict your path here return source; }
如果您还在response headers后端使用任何自定义,则还需要在CORS配置中允许它。举个例子
response headers
corsConfiguration.addAllowedHeader("*"); corsConfiguration.addExposedHeader("header1"); corsConfiguration.addExposedHeader("header2");