在Angular2

时间:2017-04-16 10:38:08

标签: angular typescript cookies cors angular2-http

我有一个应用程序,它由后端和前端组成,用Angular 2编写。当第一个请求从前端触发时,后端创建会话对象并发送带有Set-Cookie:JSESSIONID=29F2635FE558F131DCF937567E4C09C1;path=/;HttpOnly标头的响应(或其他生成的ID)。浏览器正确设置cookie,当我使用Http get()方法执行获取请求并使用withCredentials: true对象中的options时,一切正常。但是当我使用post()方法对发布请求执行相同操作时,由于某种原因,Cookie标头未设置,我无法通过后端的auth过滤器。

有没有人见过这样的行为?这可能是什么原因?请求在OPTIONS预检失败。这件事太奇怪了,我甚至不知道哪些附加信息会有所帮助,所以如果你有想法 - 请告诉我,我会提供任何必要的信息。

示例:

这就是我获取有关书籍的信息(并且可以正常使用):

this.networker.get(PATHS.base + PATHS.books, {search: this.params, withCredentials: true})
          .map((resp: Response) => {
            return resp.json() as Book[];
          });

这是我尝试将新作者添加到目录

的方式
public addAuthor(author: Author): Observable<boolean> {
    const headers: Headers = new Headers();
    headers.append('Content-Type', 'application/json');
    const options: RequestOptions = new RequestOptions({withCredentials: true, headers: headers});
    return this.networker.post(PATHS.base + PATHS.authors, JSON.stringify(author), options)
      .map((resp: Response) => {
        return resp.text().localeCompare('true') === 0;
      })
  }

Networker 服务只是Angular&#39; Http的一个包装器,因为我试图找出错误发生的位置:

@Injectable()
export class NetworkerService {

  constructor(private http: Http) {
  }

  public get(url: string, options: any): Observable<Response> {
    return this.http.get(url, options);
  }

  public post(url: string, body: any, options: any): Observable<any> {
    return this.http.post(url, body, options);
  }
}

UPD: 现在我在后端的请求过滤器中添加了逻辑,允许OPTIONS请求通过它而没有cookie,它确实有效,因此实际的POST请求确实包含cookie。问题似乎是预检请求没有必要的cookie,它应该是怎样的?

0 个答案:

没有答案