1. 程式人生 > >fetch默認不攜帶cookie

fetch默認不攜帶cookie

必須 ise ons zh-cn 指定 headers pan user 如果

最近在使用fetch向服務器發送請求,過程中的體會和遇到的問題在這裏記錄一下。

fetch返回的是一個Promise對象,我們可以對返回的結果做進一步的處理,這是與傳統ajax的一個區別。

簡單的請求寫法如下:

fetch(url)
    .then(res => res.json())
    .then(json => {
        console.log(json);
    }) 

也可以設置method、headers、body等參數,詳見fetch api。

----------------------------------------------------------------------------------------------

接下來主要是關於fetch的一個坑,那就是fetch默認不會攜帶cookie。

我們在做判斷用戶是否已登錄等權限問題的時候,有一種做法(這裏以express-session為例)是用戶登錄時將信息存入session

req.session.user = user;

此時,服務端會發送給客戶端相應的cookie

之後,來自客戶端的每一個請求,都會帶有這個cookie

而服務端通過這個cookie得到req.session.user(如果沒有cookie,那麽req.session.user === undefined),便可判斷用戶是否已登錄

if (!req.session.user) {
    console.log(
"未登錄"); }

使用fetch發送請求的我就這樣掉坑裏了。

想要解決這個問題其實很簡單,那就是在參數裏加一個字段credentials: true,如:

fetch(url, {
    method: ‘GET‘,
    credentials: ‘include‘
})

這樣,在一般情況下應該是沒問題了,沒錯,還有特殊情況,那就是跨域。

如果我們進行的是跨域請求而且是用CORS(對CORS不了解的可以看看這個)來處理的,那麽我們就需要在服務端設置一些字段,比如:

‘Access-Control-Allow-Origin‘, ‘http://localhost:8080‘,  // 不能使用*,必須指定域名,大概是出於安全考慮
‘Access-Control-Allow-credentials‘, ‘true‘ // 表示允許發送cookie到服務端

到此為止問題就解決了。

如有不對,煩請指正

fetch默認不攜帶cookie