2016-02-24 41 views

Trả lời

38

Tôi đoán rằng có một giai đoạn mà bạn yêu cầu máy chủ xác thực bạn. Theo sau (và nếu xác thực thành công), máy chủ sẽ trả lại cookie trong phản hồi. Trình duyệt sẽ lưu trữ cookie này và gửi lại cho mỗi cuộc gọi.

Điều đó nói rằng, trong trường hợp yêu cầu miền chéo (CORS), bạn cần đặt withCredentials của XHR thành true để làm cho trình duyệt thêm cookie trong yêu cầu của bạn.

Để kích hoạt tính này với Angular2, chúng ta cần phải mở rộng các lớp BrowserXhr như mô tả dưới đây:

@Injectable() 
export class CustomBrowserXhr extends BrowserXhr { 
    constructor() {} 
    build(): any { 
    let xhr = super.build(); 
    xhr.withCredentials = true; 
    return <any>(xhr); 
    } 
} 

và ghi đè lên các nhà cung cấp BrowserXhr với mở rộng:

bootstrap(AppComponent, [ 
    HTTP_PROVIDERS, 
    provide(BrowserXhr, { useClass: CustomBrowserXhr }) 
]); 

Xem các câu hỏi này để biết thêm chi tiết :

Chỉnh sửa (sau bình luận của freaker s)

Từ RC2, bạn có thể sử dụng withCredentials tài sản trực tiếp trong cấu hình yêu cầu như mô tả dưới đây:

this.http.get('http://...', { withCredentials: true }) 

Chỉnh sửa (theo nhận xét [maxou])

Hãy nhớ bao gồm withCredentials: true trên mọi yêu cầu.

+16

Tính năng này đã được thêm vào angular2 ngay bây giờ. Bây giờ bạn có thể chỉ cần làm một cái gì đó như 'http.get (url, {withCredentials: true})' do đó giải pháp tiện dụng này không cần thiết nữa (như 2.0.0-rc4 hoặc cũ hơn). – freaker

+2

Vâng, bạn nói đúng. Tôi đã được thêm vào trong RC2. Tôi đã cập nhật câu trả lời của mình cho phù hợp. Cảm ơn rất nhiều vì đã chỉ ra điều này ;-) –

+4

có vẻ như với tôi rằng bằng cách sử dụng 'withCredentials',' Set-Cookie' trong phản hồi sẽ được thiết lập bởi máy khách, nhưng máy khách vẫn không gửi 'Cookie' trong yêu cầu (được đặt theo yêu cầu trước) – maxbellec

Các vấn đề liên quan