Angular CORS误差仅来自角度,而非非非';尖角的
我对一个新Angular6应用程序出现的错误感到非常困惑。我们有一个用ASP.NET Core 2编写的现有API,并且我们一直在使用这个API,而没有任何问题,它来自一个用Typescript编写的chrome扩展,该扩展发布了如下数据:Angular CORS误差仅来自角度,而非非非';尖角的,angular,cors,Angular,Cors,我对一个新Angular6应用程序出现的错误感到非常困惑。我们有一个用ASP.NET Core 2编写的现有API,并且我们一直在使用这个API,而没有任何问题,它来自一个用Typescript编写的chrome扩展,该扩展发布了如下数据: let login: any = { username: options.userName, password: options.password }; let body: string = JSON
let login: any = {
username: options.userName,
password: options.password
};
let body: string = JSON.stringify(login);
return fetch(`${environment.jwtApiUrl}/api/token`,
{
method: "POST",
headers: {
'Accept': 'application/json',
"Content-Type": "application/json"
},
body: body
});
我们现在正在使用与Ionic 4 Angular应用程序完全相同的API,如下所示:
export class AuthenticationService {
constructor(
private http: HttpClient,
private storage: Storage) { }
public isLoggedIn(): boolean {
return this.storage.get("token") != null;
}
public async login(username: string, password: string): Promise<boolean> {
let login: any = {
username: username,
password: password
};
let body: string = JSON.stringify(login);
var result = await this.http.post<any>(`${environment.jwtApiUrl}/api/token`, body).toPromise();
if (result && result.token) {
this.storage.set("token", result.token);
return true;
};
return false;
}
logout() {
// remove user from local storage to log user out
this.storage.remove('token');
}
}
导出类身份验证服务{
建造师(
私有http:HttpClient,
专用存储:存储{}
public isLoggedIn():布尔值{
返回此.storage.get(“令牌”)!=null;
}
公共异步登录(用户名:string,密码:string):承诺{
允许登录:任意={
用户名:用户名,
密码:密码
};
let body:string=JSON.stringify(login);
var result=wait this.http.post:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access control Allow Origin”标头。因此,不允许访问源“”
为什么我们仅仅从Angular而不是chrome扩展中得到这个结果?chrome扩展也在进行跨域调用,除了在API上启用cors之外,还有其他方法可以解决这个问题吗?我认为如果不在API上启用cors或使用代理,您将无法解决这个问题
有人猜测你的Chrome扩展工作正常,可能是扩展没有相同的(安全性)浏览器的限制。我也有同样的问题,但我不想更改服务器中的CORS设置。我在开发时通过创建api bridge node.js应用程序并在服务器中运行该应用程序来解决此问题。node具有在文件(即服务器)中设置CORS的能力然后,我使用node发出api请求,并将其传递给我的angular应用程序(在开发过程中)。是这样还是像前面的回答所说的那样为您启用CORS api(或服务器)。CORS仅由浏览器强制执行,这就是为什么其他任何东西都不会影响CORS问题
飞行前选项请求是在发出实际的POST请求之前检查服务器是否接受CORS请求的请求。如果选项请求发现服务器有必要的POST请求,它将发出POST请求。如果没有,它甚至不会发出POST请求(如果它已经从选项请求中知道它没有服务器的权限,那么为什么要通过发出请求来浪费时间)
有两种方法可以解决此问题:
(1) 将相关CORS头添加到服务器响应中,确保服务器接受PUT POST DELETE GET选项(可能还有HEAD)
(2) 使用代理重写URL。浏览器向同一域和端口上的端点发出请求(从而避免CORS),为Angular应用提供服务的服务器将请求重写到不同的域和端口。对于开发环境,您可以使用--proxy config
标志以这种方式启动webpack以代理请求(网页包由引擎盖下的Angular CLI使用)。在npm启动脚本中使用--proxy config
标志。您需要在prod服务器上复制此配置
对于(2),在开发服务器上创建一个名为proxy.json的文件,如下所示:
{
"/api": {
"target": "http://localhost:9000",
"secure": false
}
}
并使用以下命令启动Angular CLI dev服务器:
ng serve --proxy-config ./proxy.json
此配置基本上表示代理指向目标域和端口的路径中以/api开头的任何请求
正如我所说,您需要在prod服务器上重复此操作,这取决于您在prod中使用的服务器。您还需要确保所有API调用都以路径中的/API开头。发生的事情是,Angular的HttpClient向任何资源发送POST请求之前,它会使用选项请求ping它。在我的情况下,我所做的只是在我发送帖子的同一个端点上取消选项请求。您可以看到解释
ng serve --proxy-config ./proxy.json