HTTP——狀態碼

(轉載)

完整的 HTTP 1.1規範說明書來自於RFC 2616,你能夠在 http://www.talentdigger.cn/home/link.php?url=d3d3LnJmYy1lZGl0b3Iub3JnLw%3D%3D在線查閱。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交換使用。例如,若是你錯誤的訪問了 http://www.talentdigger.cn/home/link.php?url=aG9zdC9%2BdXNlcg%3D%3D(路徑信息不完整),有些服務器就會回覆301狀態碼而有些則回覆302。從技術上說,若是最初的請求是GET瀏覽器只是被假定自動轉向。若是想了解更多細節,請看狀態碼307的討論。  303 (See Other/參見其餘信息) 這個狀態碼和 30一、302 類似,只是若是最初的請求是 POST,那麼新文檔(在定位頭信息中給出)藥用 GET 找回。這個狀態碼是新加入 HTTP 1.1中的。  304 (Not Modified/爲修正) 當客戶端有一個緩存的文檔,經過提供一個 If-Modified-Since 頭信息可指出客戶端只但願文檔在指定日期以後有所修改時纔會重載此文檔,用這種方式能夠進行有條件的請求。304 (SC_NOT_MODIFIED)是指緩衝的版本已經被更新而且客戶端應刷新文檔。另外,服務器將返回請求的文檔及狀態碼 200。servlet通常狀況下不會直接設置這個狀態碼。它們會實現getLastModified方法並根據修正日期讓默認服務方法處理有條件的請求。這個方法的例程已在2.8部分(An Example Using Servlet Initialization and Page Modification Dates/一個使用servlet初始化和頁面修正日期的例子)給出。  305 (Use Proxy/使用代理) 305 (SC_USE_PROXY)表示所請求的文檔要經過定位頭信息中的代理服務器得到。這個狀態碼是新加入 HTTP 1.1中的。  307 (Temporary Redirect/臨時重定向) 瀏覽器處理307狀態的規則與302相同。307狀態被加入到 HTTP 1.1中是因爲許多瀏覽器在收到302響應時即便是原始消息爲POST的狀況下仍然執行了錯誤的轉向。只有在收到303響應時才假定瀏覽器會在POST請求時重定向。添加這個新的狀態碼的目的很明確:在響應爲303時按照GET和POST請求轉向;而在307響應時則按照GET請求轉向而不是POST請求。注意:因爲某些緣由在HttpServletResponse中尚未與這個狀態對應的常量。該狀態碼是新加入HTTP 1.1中的。  注意 在 HttpServletResponse 中沒有 SC_TEMPORARY_REDIRECT 常量,因此你只能顯示的使用307狀態碼。  400 (Bad Request/錯誤請求) 400 (SC_BAD_REQUEST)指出客戶端請求中的語法錯誤。  401 (Unauthorized/未受權) 401 (SC_UNAUTHORIZED)表示客戶端在受權頭信息中沒有有效的身份信息時訪問受到密碼保護的頁面。這個響應必須包含一個WWW-Authenticate的受權信息頭。例如,在本書4.5部分中的「Restricting Access to Web Pages./限制訪問Web頁。」  403 (Forbidden/禁止) 403 (SC_FORBIDDEN)的意思是除非擁有受權不然服務器拒絕提供所請求的資源。這個狀態常常會因爲服務器上的損壞文件或目錄許可而引發。  404 (Not Found/未找到) 404 (SC_NOT_FOUND)狀態每一個網絡程序員可能都遇到過,他告訴客戶端所給的地址沒法找到任何資源。它是表示「沒有所訪問頁面」的標準方式。這個狀態碼是經常使用的響應而且在HttpServletResponse類中有專門的方法實現它:sendError("message")。相對於setStatus使用sendError得好處是:服務器會自動生成一個錯誤頁來顯示錯誤信息。可是,Internet Explorer 5瀏覽器卻默認忽略你發揮的錯誤頁面並顯示其自定義的錯誤提示頁面,雖然微軟這麼作違反了 HTTP 規範。要關閉此功能,在工具菜單裏,選擇Internet選項,進入高級標籤頁,並確認「顯示友好的 HTTP 錯誤信息」選項(在個人瀏覽器中是倒數第8各選項)沒有被選。可是不多有用戶知道此選項,所以這個特性被IE5隱藏了起來使用戶沒法看到你所返回給用戶的信息。而其餘主流瀏覽器及IE4都徹底的顯示服務器生成的錯誤提示頁面。能夠參考圖6-3及6-4中的例子。  核心警告 默認狀況下,IE5忽略服務端生成的錯誤提示頁面。  405 (Method Not Allowed/方法未容許) 405 (SC_METHOD_NOT_ALLOWED)指出請求方法(GET, POST, HEAD, PUT, DELETE, 等)對某些特定的資源不容許使用。該狀態碼是新加入 HTTP 1.1中的。  406 (Not Acceptable/沒法訪問) 406 (SC_NOT_ACCEPTABLE)表示請求資源的MIME類型與客戶端中Accept頭信息中指定的類型不一致。見本書7.2部分中的表7.1(HTTP 1.1 Response Headers and Their Meaning/HTTP 1.1響應頭信息以及他們的意義)中對MIME類型的介紹。406是新加入 HTTP 1.1中的。  407 (Proxy Authentication Required/代理服務器認證要求) 407 (SC_PROXY_AUTHENTICATION_REQUIRED)與401狀態有些類似,只是這個狀態用於代理服務器。該狀態指出客戶端必須經過代理服務器的認證。代理服務器返回一個Proxy-Authenticate響應頭信息給客戶端,這會引發客戶端使用帶有Proxy-Authorization請求的頭信息從新鏈接。該狀態碼是新加入 HTTP 1.1中的。  408 (Request Timeout/請求超時) 408 (SC_REQUEST_TIMEOUT)是指服務端等待客戶端發送請求的時間過長。該狀態碼是新加入 HTTP 1.1中的。  409 (Conflict/衝突) 該狀態一般與PUT請求一同使用,409 (SC_CONFLICT)狀態常被用於試圖上傳版本不正確的文件時。該狀態碼是新加入 HTTP 1.1中的。  410 (Gone/已經不存在) 410 (SC_GONE)告訴客戶端所請求的文檔已經不存在而且沒有更新的地址。410狀態不一樣於404,410是在指導文檔已被移走的狀況下使用,而404則用於未知緣由的沒法訪問。該狀態碼是新加入 HTTP 1.1中的。  411 (Length Required/須要數據長度) 411 (SC_LENGTH_REQUIRED)表示服務器不能處理請求(假設爲帶有附件的POST請求),除非客戶端發送Content-Length頭信息指出發送給服務器的數據的大小。該狀態是新加入 HTTP 1.1的。  412 (Precondition Failed/先決條件錯誤) 412 (SC_PRECONDITION_FAILED)狀態指出請求頭信息中的某些先決條件是錯誤的。該狀態是新加入 HTTP 1.1的。  413 (Request Entity Too Large/請求實體過大) 413 (SC_REQUEST_ENTITY_TOO_LARGE)告訴客戶端如今所請求的文檔比服務器如今想要處理的要大。若是服務器認爲可以過一段時間處理,則會包含一個Retry-After的響應頭信息。該狀態是新加入 HTTP 1.1的。  414 (Request URI Too Long/請求URI過長) 414 (SC_REQUEST_URI_TOO_LONG)狀態用於在URI過長的狀況時。這裏所指的「URI」是指URL中主機、域名及端口號以後的內容。例如:在URL--http://www.y2k-disaster.com:8080/we/look/silly/now/中URI是指/we/look/silly/now/。該狀態是新加入 HTTP 1.1的。  415 (Unsupported Media Type/不支持的媒體格式) 415 (SC_UNSUPPORTED_MEDIA_TYPE)意味着請求所帶的附件的格式類型服務器不知道如何處理。該狀態是新加入 HTTP 1.1的。  416 (Requested Range Not Satisfiable/請求範圍沒法知足) 416表示客戶端包含了一個服務器沒法知足的Range頭信息的請求。該狀態是新加入 HTTP 1.1的。奇怪的是,在servlet 2.1版本API的HttpServletResponse中並無相應的常量表明該狀態。  注意 在servlet 2.1的規範中,類HttpServletResponse並無SC_REQUESTED_RANGE_NOT_SATISFIABLE 這樣的常量,因此你只能直接使用416。在servlet 2.2版本以後都包含了此常量。  417 (Expectation Failed/指望失敗) 若是服務器獲得一個帶有100-continue值的Expect請求頭信息,這是指客戶端正在詢問是否能夠在後面的請求中發送附件。在這種狀況下,服務器也會用該狀態(417)告訴瀏覽器服務器不接收該附件或用100 (SC_CONTINUE)狀態告訴客戶端能夠繼續發送附件。該狀態是新加入 HTTP 1.1的。  500 (Internal Server Error/內部服務器錯誤) 500 (SC_INTERNAL_SERVER_ERROR) 是經常使用的「服務器錯誤」狀態。該狀態常常由CGI程序引發也可能(希望不會如此!)由沒法正常運行的或返回頭信息格式不正確的servlet引發。  501 (Not Implemented/未實現) 501 (SC_NOT_IMPLEMENTED)狀態告訴客戶端服務器不支持請求中要求的功能。例如,客戶端執行了如PUT這樣的服務器並不支持的命令。  502 (Bad Gateway/錯誤的網關) 502 (SC_BAD_GATEWAY)被用於充當代理或網關的服務器;該狀態指出接收服務器接收到遠端服務器的錯誤響應。  503 (Service Unavailable/服務沒法得到) 狀態碼503 (SC_SERVICE_UNAVAILABLE)表示服務器因爲在維護或已經超載而沒法響應。例如,若是某些線程或數據庫鏈接池已經沒有空閒則servlet會返回這個頭信息。服務器可提供一個Retry-After頭信息告訴客戶端何時能夠在試一次。  504 (Gateway Timeout/網關超時) 該狀態也用於充當代理或網關的服務器;它指出接收服務器沒有從遠端服務器獲得及時的響應。該狀態是新加入 HTTP 1.1的。  505 (HTTP Version Not Supported/不支持的 HTTP 版本) 505 (SC_HTTP_VERSION_NOT_SUPPORTED)狀態碼是說服務器並不支持在請求中所標明 HTTP 版本。該狀態是新加入 HTTP 1.1的。
相關文章
相關標籤/搜索