我无法使用 Angular 发布到不同于“localhost”的地址

问题描述

我正在创建一个简单的网页,我使用 Angular 作为客户端,使用 Spring Boot 作为服务器。首先,我使用本地主机进行了测试,我的 angular 应用程序示例:

这是我与java服务器通信的service.ts:

url="http//localhost/demo";

login(u:user){
  return this.http.post<user>(this.url+'/login',u);
}

上面的代码工作正常,当我尝试使用分配给服务器的域名在生产中使用这个应用程序时,问题就开始了。

url="http//domain/demo";

login(u:user){
  return this.http.post<user>(this.url+'/login',u);
}

我不知道发生了什么,我已经使用邮递员应用程序完成了测试,我可以正确地完成帖子并使用 url(http//domain/demo) 收到响应,因此 dns、端口转发和 java 服务器不是问题。我使用了wireshark来捕获请求和响应,我很惊讶甚至没有生成请求消息,就像angular会因为不是本地主机url而阻止请求。

感谢您的关注

解决方法

很可能您遇到了 CORS 强制执行的限制。只有特定的请求集才能在没有被 CORS 规则阻止的情况下完成 - 这些被称为 simple requests。对于所有其他类型的请求,您尝试连接的主机必须明确允许从不同域访问其资源。这是通过所谓的飞行前请求完成的。

如果预检失败 - 请求被阻止。 Angular 应用程序(任何 js 应用程序)甚至不会被通知导致错误的原因。您只会收到错误代码 0(如果我没记错的话)。如果服务器响应未声明允许来自您当前域的请求(通过明确提及或通配符),或者服务器根本没有响应预检,则预检可能会失败。

CORS 规则由浏览器本身强制执行。因此,您将能够使用例如 Wget、CURL、Postman 和任何其他 http 客户端来执行特定请求,但浏览器将阻止完全相同的请求。这显然适用于 XHR 请求(简单来说,通过 JS 完成的请求)

CORS 规则不适用于 localhost