我有一个angulat http拦截器,试图将Authorization标头添加到请求中,但是当代码运行的结果不是我期望的结果时,该方法从POST更改为OPTIONS,并且出现如下错误: / p>
从原点“ http://localhost/authorization/oauth/token”到“ http://localhost:4200”的XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:它没有HTTP正常状态。
@Injectable()
export class DlkmInterceptor implements HttpInterceptor {
constructor() {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (request.url === authConfig.tokenEndpoint && request.method === 'POST') {
let authData = window.btoa(authConfig.clientId + ':' + authConfig.dummyClientSecret);
request = request.clone({
setHeaders: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic ' + authData
}
});
return next.handle(request);
} else {
request = request.clone({});
return next.handle(request)
}
}
}
答案 0 :(得分:1)
这是预期的行为。这是由于浏览器的Cross Origin Policy。
由于您正在从托管Angular Application的域之外的域请求资源,因此浏览器将遵循跨源策略
当您请求来自其他来源的资源时,浏览器首先会通过发送OPTIONS请求(也称为preflight请求)来检查您是否可以真正请求该资源
您需要允许后端服务器中的标头才能使预检请求成功,当预检请求成功时,浏览器将发出实际的请求。
您可以了解有关此主题的更多信息here