我正在使用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动词)是什么.这通常是用于修改数据的货币操作(例如POST或PUT)所必需的.
因此,您的前端将首先进行此调用,而后端需要使用允许的方法进行响应,您还可以限制特定的URI,然后在成功验证后进行目标调用.
这是完全正常的,角度在内部执行此操作,以便在不知道服务器是否允许的情况下不会发出不必要的数据请求.
这是在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;
}
如果您还在后端使用任何自定义响应标头,则还需要在CORS配置中允许它.
举个例子
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addExposedHeader("header1");
corsConfiguration.addExposedHeader("header2");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。