2017-04-07 39 views
0

我們正面臨着一個奇怪的cookie問題。服務器從一個端點返回下面像https://product.example.com/rest/v1/stuff使用iframe時,Set-Cookie似乎會損壞

Set-Cookie: id=c50b72c0-0b3a-11e7-b356-002590812948;Version=1;Comment="ID";Domain=.example.com;Path=/;HttpOnly 

一旦做到這一點,我們創建了一個iframe和iframe中的所有請求,預計發送cookie。當瀏覽器的下一個請求(IFRAME REF)的幾件事情之一發生

  1. 沒有的cookie被髮送
  2. 的cookie被髮送的ID = 9b639ea0-e800-11e6-b3ee-002590812948
  3. 餅乾被髮送爲id = 9b639ea0-e800-11e6-b3ee-002590812948; ID = c50b72c0-0b3a-11E7-b356-002590812948
  4. 餅乾得到爲ID = c50b72c0-0b3a-11E7-b356-002590812948發送

如果第一請求不使用正確的cookie,則下一組可能會發生變化並做不同的事情(加載頁面後約50個HTTP調用,每個做4個列出的狀態之一)

我們看到它發生在Chrome,Safari和Firefox中。

調試:

這可能是一個程序問題,但我們還沒有找到一種方法來調試什麼是設置cookie。是否有任何瀏覽器可以通知我們有關cookie狀態的更改(從http或js)?

的Javascript:

我們使用反應14,這裏是有問題的代碼

進行網絡請求

getUri(id) 
    .then((uri) => { 
    self.dispatch(uri.uri); 
    }) 
    .catch((errorMessage) => { 
    self.actions.idFailures(errorMessage) 
    }) 

這裏是getUri

getUri(id) { 
return new Promise(function(resolve, reject) { 
    let url = 'rest/stuff/' + id; 
    request 
    .get(url) 
    .set('Accept', 'application/json') 
    .end(function(err, result){ 
     if(err || !result){ 
     reject(Error(err.response.text)); 
     } 
     else { 
     resolve(JSON.parse(result.text)); 
     } 
    }); 
}); 

},

設置IFRAME

if(this.state.uri) { 
    instance = <iframe src={this.state.uri} style={iFrameStyle}> </iframe>; 
} 
+0

如果您不發佈代碼,您如何指望我們弄清楚您做錯了什麼? – Barmar

+0

我在您發佈的代碼中沒有看到與Cookie相關的任何內容。 – Barmar

+0

http響應是什麼設置Cookie – ekaqu

回答

0

是否有任何瀏覽器中,我們可以得到通知的任何更改Cookie狀態?

您可以編寫計時器來定期檢查Cookie狀態,並在cookie狀態更改時在控制檯中輸出有用的信息。以示例代碼檢查can i be notified of cookie changes in client side javascript。下面的代碼將工作:

var lastCookie = document.cookie; 
var checkCookie = function() { 
    var currentCookie = document.cookie; 
    if (currentCookie != lastCookie) { 
    console.log('cookie changed!'); 
    console.log('old cookie:'); 
    console.log(lastCookie); 
    console.log('new cookie:'); 
    console.log(currentCookie); 
    lastCookie = currentCookie; 
    } 
}; 

window.setInterval(checkCookie, 1000); 

然而,該cookie變化只能在執行代碼,這意味着HTML文件應答的Set-Cookie可能錯過之後檢測到。

在您的代碼中,使用一個Set-Cookie響應標頭設置了多個cookie值,這是不推薦的。前面的討論請查看Is it possible to set more than one cookie with a single Set-Cookie?

+0

「n您的代碼,多個cookie值是使用一個Set-Cookie響應標頭設置的,」我們在所有瀏覽器中看到,後端每個Set-Cookie返回一個Cookie鍵/值,只有其他字段是Cookie的路徑和域名。 – ekaqu

+0

我試着用js腳本來檢測cookie的變化,它從不做任何事情(添加控制檯日誌來顯示更改)。 – ekaqu

+0

@ekaqu是'Set-Cookie'屬性的'Version'和'Comment'部分嗎?我在https://tools.ietf.org/html/rfc6265#section-4.1找不到任何相關信息。 – shaochuancs