我有一个应用程序,它由后端和前端组成,用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,它应该是怎样的?