HTTP狀態碼大全
HTTP 1.1的狀態碼被標記為新特性,因為許多瀏覽器只支援 HTTP 1.0。你應只把狀態碼傳送給支援 HTTP 1.1的客戶端,支援協議版本可以通過呼叫request.getRequestProtocol來檢查。
本部分餘下的內容會詳細地介紹 HTTP 1.1中的狀態碼。這些狀態碼被分為五大類:
100-199 用於指定客戶端應相應的某些動作。
200-299 用於表示請求成功。
300-399 用於已經移動的檔案並且常被包含在定位頭資訊中指定新的地址資訊。
400-499 用於指出客戶端的錯誤。
500-599 用於支援伺服器錯誤。
HttpServletResponse中的常量代表關聯不同標準訊息的狀態碼。在servlet程式中,你會更多地用到這些常量的標識來使用狀態碼。例如:你一般會使用response.setStatus(response.SC_NO_CONTENT)而不是 response.setStatus(204),因為後者不易理解而且容易導致錯誤。但是,你應當注意到伺服器允許對訊息輕微的改變,而客戶端只注意狀態碼的數字值。所以伺服器可能只返回 HTTP/1.1 200 而不是 HTTP/1.1 200 OK。
100 (Continue/繼續)
如果伺服器收到頭資訊中帶有100-continue的請求,這是指客戶端詢問是否可以在後續的請求中傳送附件。在這種情況下,伺服器用100(SC_CONTINUE)允許客戶端繼續或用417 (Expectation Failed)告訴客戶端不同意接受附件。這個狀態碼是 HTTP 1.1中新加入的。
101 (Switching Protocols/轉換協議)
101 (SC_SWITCHING_PROTOCOLS)狀態碼是指伺服器將按照其上的頭資訊變為一個不同的協議。這是 HTTP 1.1中新加入的。
200 (OK/正常)
200 (SC_OK)的意思是一切正常。一般用於相應GET和POST請求。這個狀態碼對servlet是預設的;如果沒有呼叫setStatus方法的話,就會得到200。
201 (Created/已建立)
201 (SC_CREATED)表示伺服器在請求的響應中建立了新文件;應在定位頭資訊中給出它的URL。
202 (Accepted/接受)
202 (SC_ACCEPTED)告訴客戶端請求正在被執行,但還沒有處理完。
203 (Non-Authoritative Information/非官方資訊)
狀態碼203 (SC_NON_AUTHORITATIVE_INFORMATION)是表示文件被正常的返回,但是由於正在使用的是文件副本所以某些響應頭資訊可能不正確。這是 HTTP 1.1中新加入的。
204 (No Content/無內容)
在並沒有新文件的情況下,204 (SC_NO_CONTENT)確保瀏覽器繼續顯示先前的文件。這各狀態碼對於使用者週期性的過載某一頁非常有用,並且你可以確定先前的頁面是否已經更新。例如,某個servlet可能作如下操作:
int pageVersion =Integer.parseInt(request.getParameter("pageVersion"));
if (pageVersion >;= currentVersion) {
response.setStatus(response.SC_NO_CONTENT);
} else {
// Create regular page
}
但是,這種方法對通過重新整理響應頭資訊或等價的HTML標記自動過載的頁面起作用,因為它會返回一個204狀態碼停止以後的過載。但基於JavaScript指令碼的自動過載在這種情況下仍然需要能夠起作用。可以閱讀本書7.2 ( HTTP 1.1 Response Headers and Their Meaning/HTTP 1.1響應頭資訊以及他們的意義)部分的詳細討論。
205 (Reset Content/重置內容)
重置內容205 (SC_RESET_CONTENT)的意思是雖然沒有新文件但瀏覽器要重置文件顯示。這個狀態碼用於強迫瀏覽器清除表單域。這是 HTTP 1.1中新加入的。
206 (Partial Content/區域性內容)
206 (SC_PARTIAL_CONTENT)是在伺服器完成了一個包含Range頭資訊的區域性請求時被髮送的。這是 HTTP 1.1中新加入的。
300 (Multiple Choices/多重選擇)
300 (SC_MULTIPLE_CHOICES)表示被請求的文件可以在多個地方找到,並將在返回的文件中列出來。如果伺服器有首選設定,首選項將會被列於定位響應頭資訊中。
301 (Moved Permanently)
301 (SC_MOVED_PERMANENTLY)狀態是指所請求的文件在別的地方;文件新的URL會在定位響應頭資訊中給出。瀏覽器會自動連線到新的URL。
302 (Found/找到)
與301有些類似,只是定位頭資訊中所給的URL應被理解為臨時交換地址而不是永久的。注意:在 HTTP 1.0中,訊息是臨時移動(Moved Temporarily)的而不是被找到,因此HttpServletResponse中的常量是SC_MOVED_TEMPORARILY不是我們以為的SC_FOUND。
注意
代表狀態碼302的常量是SC_MOVED_TEMPORARILY而不是SC_FOUND。
狀態碼302是非常有用的因為瀏覽器自動連線在定為響應頭資訊中給出的新URL。這非常有用,而且為此有一個專門的方法——sendRedirect。使用response.sendRedirect(url)比呼叫response.setStatus(response.SC_MOVED_TEMPORARILY)和response.setHeader("Location", url)多幾個好處。首先,response.sendRedirect(url)方法明顯要簡單和容易。第二,servlet自動建立一頁儲存這一連線以提供給那些不能自動轉向的瀏覽器顯示。最後,在servlet 2.2版本(J2EE中的版本)中,sendRedirect能夠處理相對路徑,自動轉換為絕對路徑。但是你只能在2.1版本中使用絕對路徑。
如果你將使用者轉向到站點的另一頁中,你要用 HttpServletResponse 中的 encodeURL 方法傳送URL。這麼做可預防不斷使用基於URL重寫的會話跟蹤的情況。URL重寫是一種在你的網站跟蹤不使用 cookies 的使用者的方法。這是通過在每一個URL尾部附加路徑資訊實現的,但是 servlet 會話跟蹤API會自動的注意這些細節。會話跟蹤在第九章討論,並且養成使用 encodeURL 的習慣會使以後新增會話跟蹤的功能更容易很多。
核心技巧
如果你將使用者轉向到你的站點的其他頁面,用 response.sendRedirect(response.encodeURL(url)) 的方式事先計劃好會話跟蹤(session tracking)要比只是呼叫 response.sendRedirect(url) 好的多。
這個狀態碼有時可以與301交換使用。例如,如果你錯誤的訪問了