在的HTTP錯誤代碼的預期目的而言,我肯定會用403 Forbidden
去,因爲頁面不存在(404出),但用戶禁止訪問它,現在(和這個限制不是由於資源衝突,如同時修改,但由於用戶的帳戶狀態,即我認爲409也是如此。基於其預期目的的另一個明智的選擇可能是401,但正如他的評論中已經注意到的那樣,此代碼會觸發一些(如果不是全部的話)瀏覽器顯示登錄對話框,因爲這意味着使用標準Web認證機制可以解決問題。所以,這絕對不是您的選擇。
兩件事情似乎在403的描述有點「misfitting」,所以讓我解決這些問題:
- 授權不會幫助...:有關HTTP內部授權機制這隻會談協議,旨在區分403與401。此聲明不適用於任何形式的自定義授權或會話狀態管理。
- ...請求不應該重複...:請求必須始終在會話上下文中看到,因此如果用戶的會話上下文發生更改(他解鎖某個功能),然後他重試訪問相同的資源,這是一個不同的要求,即沒有違反這一建議。
當然,你也可以定義自己的錯誤代碼,但由於它可能不會在任何官方的方式保留,也不能保證,一些瀏覽器廠商是不會有意或無意地使用完全相同該代碼來觸發特定的(調試)操作。這是不可能的,但不被禁止。
418也可以,但是。 :)
當然,如果您想特別隱藏功能的潛在可用性,您也可以決定使用404,因爲這是不給任何黑暗用戶任何提示的唯一方法。現在
,你的緩存問題:
無論這些狀態代碼(403,404,409,418)應該觸發瀏覽器緩存頁面違背自己的意願比其他任何一個。問題是,許多瀏覽器只是試圖緩存一切就像瘋了一樣,以加快速度。在我看來,歌劇是最糟糕的。我在這些事情上多次拉我的頭髮。它應該可以使用正確的標題設置來處理它,但是我有過瀏覽器或服務器或某個中間代理決定忽略它們並且無論如何都會中斷我的頁面的情況。
到目前爲止我發現的絕對肯定保證重新加載的唯一可靠方法是添加一個虛擬請求參數,如/ fields?t = 29873,其中29873是每個請求所獨有的數字在任何可能相關的時間範圍內。當然,在服務器上,你可以簡單地忽略這個參數。請注意,僅當用戶首次打開頁面時,從1開始並不足以滿足以下請求,因爲瀏覽器可能會跨頁重新加載緩存。
我做我的Web開發中的Java(服務器和使用GWT客戶端),我用這個代碼來生成虛擬的「數字」:
private static final char[] base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_.".toCharArray();
private static int tagIndex = 0;
/**
* Generates a unique 6-character tag string that is guaranteed to not repeat
* for about 400 days, if this function is, on average, not called more often
* than twice every millisecond.
*
* @return the tag string
*/
public static String nowTag() {
int tag = (int) ((System.currentTimeMillis() >>> 5)); // adjust
char[] result = new char[6];
result[5] = base64chars[(tagIndex++) & 63];
result[4] = base64chars[tag & 63];
tag >>>= 6;
result[3] = base64chars[tag & 63];
tag >>>= 6;
result[2] = base64chars[tag & 63];
tag >>>= 6;
result[1] = base64chars[tag & 63];
tag >>>= 6;
result[0] = base64chars[tag & 63];
return new String(result);
}
它使用系統的時鐘結合一個計數器能夠每ms提供約兩個保證唯一值。您可能不需要這種速度,所以您可以隨時更改我標記爲「調整」的>>> 5
以符合您的需求。如果你將它增加1,你的利率下降兩倍,你的唯一性時間加倍。因此,例如,如果您將>>> 8
代替,則可以每4毫秒生成一個值,並且這些值不應在3200天內重複。當然,如果用戶使用系統時鐘混淆,這種保證值不會重複的情況將會消失。但是,由於這些值不是按順序生成的,所以您很可能不會再次輸入相同的數字。該代碼生成一個6個字符的文本字符串(base64),而不是一個十進制數字,以使URL儘可能短。
希望這會有所幫助。:)
我不知道正確的答案,但下面的帖子提供了一些有趣的參數:http://stackoverflow.com/questions/3297048/403-forbidden-vs-401-unauthorized-http-responses – RobJohnson 2013-02-21 16:22:57
爲什麼不到只是重定向到他們被允許在的頁面?也可能顯示彈出窗口,說該功能尚未提供。 – 2013-02-21 22:11:57
順便說一句,'401 Unauthorized'會是一個壞主意,因爲這個狀態碼僅用於HTTP身份驗證,瀏覽器專門處理這個狀態碼。 – nalply 2013-02-22 21:17:57