angular - serviceWorker 删除 Origin 请求 header

标签 angular cors angular-cli service-worker angular-service-worker

我有一个 angular 应用程序,一旦我按照以下步骤添加了一个 serviceWorker:

https://github.com/angular/angular-cli/blob/master/docs/documentation/build.md#service-worker
https://angular.io/guide/service-worker-getting-started

…我的 API 请求不再有 Origin请求 header ,这似乎导致我的 API 服务器不返回 Access-Control-Allow-Origin响应头,导致浏览器错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource.



简单地删除 serviceWorker 并取消注册它会使行为恢复正常。

如何在继续使用我的 Restful API 的同时实现 serviceWorker?

所有请求都受到影响,但有些请求是由 oidc-client 在“幕后”提出的。 ;所有其他的看起来像:
public getBook(bookId: number): Observable<Book> {
  const request = new HttpRequest(
    'get',
    `https://some-server.asurewebsites.net/api/book/${bookId}`,
    {
      reportProgress: true,
      responseType: 'json'
    }
  );
  return this.httpClient.request<any>(request).do(event => {
    this.progressService.processEvent(event);
  }).filter(event => event instanceof HttpResponse)
  .map((response: HttpResponse<any>) => deserializeBook(response.body)).catch(error => {
    if (error instanceof HttpErrorResponse) {
      if (error.status === 404) {
        return Observable.of(null);
      }
    }
    return Observable.throw(error);
  });
}
// note: other constraints require listening to progress from per-request level rather than using a HttpIntercepter. 

更新 1:

手动设置 Origin我得到:

Refused to set unsafe header "Origin"



手动设置 Access-Control-Allow-Origin什么都不做,因为它是一个响应头。

Fetch API 有一个 Request.mode当设置为 'cors'将发送 OPTIONS请求 Origin头像正常。我会尝试明确设置它,但我在研究或在文档中找到如何使用 Angular 设置它时遇到问题 HttpClient
更新 2:

我尝试将请求之一转换为使用 Fetch API。所以我设置了Request.mode'cors' ,但我仍然没有 Origin请求头和没有 Access-Control-Allow-Origin响应头。
public getBookList(): Observable<BookList[]> {
  const fetchHeaders = new Headers();
  fetchHeaders.set('Authorization', 'Bearer ${token}');
  const fetchRequest  = new Request(`https://some-server.asurewebsites.net/api/book`, {
    method: 'get',
    headers: fetchHeaders,
    mode: 'cors'
  });
  return Observable.fromPromise(fetch(fetchRequest).then(response => response.json()))
    .map((results: any[]) => results.map(entity => deserializeBook(entity)));
}

enter image description here

TLDR

注册 Service Worker 后,浏览器不再使用 CORS,即使 mode: 'cors'由客户端明确设置。如何使用 Service Worker 和 CORS?

最佳答案

转到托管 API 的服务器,并对 CORS 配置进行以下更改。
从此更改允许的来源:

<AllowedOrigin>*</AllowedOrigin>
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>

关于angular - serviceWorker 删除 Origin 请求 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48123307/

相关文章:

jquery - 如何在 CORS 预检选项请求中发送自定义 header ?

javascript - Angular 5 : adding types to external JS file

angular - ng cli更新到版本10后,VS 2019没有智能感知和验证

typescript - 如何从angular2中的observable中获取数据

angular - HttpInterceptor 不拦截 Angular 10 中的请求

javascript - 如何启用对启用了 Google Compute Engine IAP 的负载均衡器的 CORS 请求?

cors - 为什么需要访问控制公开 header ?

angular - 使用 ansi-html 的 angular5 中的意外字符 (#) 错误

Angular2/4 如何根据插入的数据自动更新 formArray 大小?

javascript - 如何使用 Angular 5 中的 ngrx 状态仅更新一个对象属性或数组中的多个对象属性?