Angular Interceptor修改标头更改请求方法

时间:2019-06-13 11:38:54

标签: angular typescript http

我有一个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)
   }

 }
}

1 个答案:

答案 0 :(得分:1)

这是预期的行为。这是由于浏览器的Cross Origin Policy

由于您正在从托管Angular Application的域之外的域请求资源,因此浏览器将遵循跨源策略

当您请求来自其他来源的资源时,浏览器首先会通过发送OPTIONS请求(也称为preflight请求)来检查您是否可以真正请求该资源

您需要允许后端服务器中的标头才能使预检请求成功,当预检请求成功时,浏览器将发出实际的请求。

您可以了解有关此主题的更多信息here