在搜索引擎中輸入「HTTP狀態碼」,或者輸入「http status code」,能夠找到詳盡的資料。可是,這些資料大都是描述了狀態碼的定義,至於技術上的微妙之處,只能是靠本身摸索了吧。javascript
204和304的區別,直接告訴你們答案,仍是先賣個關子呢?知道答案的看到這裏能夠離開了,不知道答案的若是着急,能夠直接跳到最後。若是還有些興趣,那就跟我一步步來吧,這樣記憶會更長久一些。html
204和304的定義,簡單描述以下:java
204 No Content 304 Not Modified
顧名思義卻是能看出一些端倪。可是,不管是英文仍是中文,204的補充說明頗有誤導性:瀏覽器
If the client is a user agent, it SHOULD NOT change its document view. 在並無新文檔的狀況下,204 (SC_NO_CONTENT)確保瀏覽器繼續顯示先前的文檔。
在真相大白以前,仍是先看看我遇到的問題吧。緩存
現象:服務器
網頁使用了jQuery。本機IE10打開頁面沒有問題。兩位同事的IE10打開頁面報$函數不存在錯誤。 ide
分析:函數
兩位同事的IE10對兩個頁面中相同來源的javascript文件,只執行一遍。打開第一個頁面可以正常顯示,打開第二個頁面則報$函數不存在錯誤。搜索引擎
錯誤的解決方式:spa
恢復IE默認配置,以下圖所示:
正確的解決方式:
注意到這個站點在輸出內容以前有這麼一個邏輯
if(resultText.equals("")){ httpServletResponse.setStatus(204); }
正確的作法是把整個if語句所有注掉。瀏覽器的配置是「自動」仍是「每次訪問網頁時」,都行。錯誤現象中「本機IE10打開頁面沒有問題」是個誤導,只要操做「得當」,問題在本機也是能夠再現的。
真相,204和304的區別:
在本例中,204的同時返回了空文件,這個空文件要替換上次緩存的文件。這樣第一次打開頁面獲取jQuery代碼是正確的,頁面正常顯示;第二次打開頁面時詢問是否要更新,結果返回了空文件,這個空文件成爲了新的緩存,而後錯誤現象看起來就像是jQuery沒有加載,並且之後也不會再「加載」了,由於文件是空的拿什麼加載?註釋掉那個httpServletResponse.setStatus(204)的程序指令,Web服務器就自動返回304了,304的意思是還用上次的緩存,這樣就不會有空文件的問題,因此頁面正常顯示。這就解釋了爲何當出現問題時清空緩存有用,也不難理解爲何「每次從服務器刷新」更有用。由於瀏覽器安裝的默認配置就是有緩存機制的,咱們要求每一個用戶去修改他們的配置不現實,因此假若不可以正確地理解到204和304的微妙區別,便不能剷除錯誤的根源,留下一個陰影在那裏微笑。