serviceWorker删除Origin请求标头

Wil*_*han 11 cors service-worker angular-cli angular angular-service-worker

我有一个有角度的应用程序,只要我按照以下步骤添加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请求标头,这似乎导致我的API服务器不返回Access-Control-Allow-Origin响应标头,导致浏览器错误:

请求的资源上不存在"Access-Control-Allow-Origin"标头.

只需删除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. 
Run Code Online (Sandbox Code Playgroud)

UPDATE1:

手动设置Origin我得到:

拒绝设置不安全的标题"Origin"

手动设置Access-Control-Allow-Origin不执行任何操作,因为它是响应标头.

Fetch API Request.mode在设置为时'cors'会发送一个OPTIONS带有Origin正常标头的请求.我会尝试明确地设置它,但我在研究或找到文档中如何使用angular设置它时遇到了麻烦HttpClient

UPDATE2:

我尝试将其中一个请求转换为使用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)));
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

TLDR

一旦服务工作者注册,浏览器就不再使用CORS,即使mode: 'cors'客户端明确设置了CORS .我如何使用服务工作者和CORS?

小智 1

转到托管 API 的服务器,并对 CORS 配置进行以下更改。

从此更改允许的来源:

<AllowedOrigin>*</AllowedOrigin>
Run Code Online (Sandbox Code Playgroud)

<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
Run Code Online (Sandbox Code Playgroud)