2009-11-17 87 views
93

我目前正在使用的應用程序有一個會話超時值。如果用戶沒有互動的情況比這個值長的時間,他們嘗試加載下一頁,他們將被提示登錄。HTTP 401 - 什麼是適當的WWW-Authenticate標頭值?

提出通過這一機制,其中包括AJAX調用路由的所有請求。最初,我們發送了一個包含登錄頁面的200頭文件,它引入了AJAX的一些問題,因爲如果發送了200響應,代碼就會運行,並且從這些RPC調用返回的大部分數據都是JSON或獲得評估的原始JavaScript問:|)。

我認爲401是更好的,因爲我們的JSON解析器不會嘗試使用一個HTML登錄頁面.. :)

reading the spec,但是,我注意到,WWW-Authenticate場絕也被髮送。

什麼是該領域的良好價值? Application Login會不會足夠?

回答

58

當指示HTTP基本驗證我們返回類似:

WWW-Authenticate: Basic realm="myRealm" 

Basic是方案,其餘是對方案非常依賴。在這種情況下,領域只是向瀏覽器提供一個文字,在提示用戶標識和密碼時可以顯示給用戶。

你顯然不會使用基本然而,由於沒有有一點會話到期時,使用基本驗證。我假設你正在使用某種形式的基於表單的身份驗證。

從回憶中,Windows質詢響應使用不同的方案和不同的參數。

訣竅在於,它是由瀏覽器,以確定它支持什麼方案,以及如何響應他們。

我的直覺,如果你使用的是基於表單的身份驗證是留在200 +重新登錄頁面,但添加自定義標題,瀏覽器會忽略,但您的AJAX能夠識別。

對於一個非常好的用戶+ AJAX體驗,讓腳本掛在發現會話過期的AJAX請求上,通過彈出窗口發出重新登錄請求,並在成功時重新提交原始AJAX請求並繼續像平常一樣。

避免剛剛得到腳本擊中部位每隔5分鐘保持會話活着的原因,僅僅擊敗會話終結點的騙子。

另一種替代方法是刻錄AJAX請求,但這是糟糕的用戶體驗。

+1

感謝隊友,現在我使用的是403,而不是因爲它不是重定向,它從字面上包含登錄表單代替原始頁面。它也更符合W3規範。 但是,感謝您的信息。 – 2009-11-17 13:46:53

+2

查看關於如何仍然可以使用HTTP 401的答案:http://stackoverflow.com/questions/928874/how-do-i-keep-firefox-from-prompting-for-username-password-with-http-basic -auth/19102200#19102200 – lanoxx 2013-09-30 19:59:33

+0

是的,只要把任何東西放在WWW-Authenticate頭文件中,我想。類似的另一個答案是http://stackoverflow.com/a/1088127/689161或者乾脆違反規範,不要打擾發送標題(至少有幾個網站這樣做); 401仍然比403更合適。 – gengkev 2015-03-16 17:23:10

-3

當用戶會話超時時,我發回一個HTTP 204狀態碼。請注意,HTTP 204狀態不包含內容。在客戶端我這樣做:

xhr.send(null); 
if (xhr.status == 204) 
    Reload(); 
else 
    dropdown.innerHTML = xhr.responseText; 

這裏是刷新()函數:

function Reload() { 
    var oForm = document.createElement("form"); 
    document.body.appendChild(oForm); 
    oForm.submit(); 
    } 
+2

你怎麼使用HTTP 204? https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204 – 2017-01-23 11:52:09