本部分余下的內(nèi)容會(huì)詳細(xì)地介紹 HTTP 1.1中的狀態(tài)碼。這些狀態(tài)碼被分為五大類:
100-199 用于指定客戶端應(yīng)相應(yīng)的某些動(dòng)作漩蟆。
200-299 用于表示請求成功。
300-399 用于已經(jīng)移動(dòng)的文件并且常被包含在定位頭信息中指定新的地址信息。
400-499 用于指出客戶端的錯(cuò)誤。
500-599 用于支持服務(wù)器錯(cuò)誤功炮。
HttpServletResponse中的常量代表關(guān)聯(lián)不同標(biāo)準(zhǔn)消息的狀態(tài)碼。在servlet程序中术唬,你會(huì)更多地用到這些常量的標(biāo)識來使用狀態(tài)碼薪伏。例如:你一般會(huì)使用response.setStatus(response.SC_NO_CONTENT)而不是 response.setStatus(204),因?yàn)楹笳卟灰桌斫舛胰菀讓?dǎo)致錯(cuò)誤粗仓。但是嫁怀,你應(yīng)當(dāng)注意到服務(wù)器允許對消息輕微的改變,而客戶端只注意狀態(tài)碼的數(shù)字值借浊。所以服務(wù)器可能只返回 HTTP/1.1 200 而不是 HTTP/1.1 200 OK塘淑。
100 (Continue/繼續(xù))
如果服務(wù)器收到頭信息中帶有100-continue的請求,這是指客戶端詢問是否可以在后續(xù)的請求中發(fā)送附件蚂斤。在這種情況下存捺,服務(wù)器用 100(SC_CONTINUE)允許客戶端繼續(xù)或用417 (Expectation Failed)告訴客戶端不同意接受附件。這個(gè)狀態(tài)碼是 HTTP 1.1中新加入的橡淆。
101 (Switching Protocols/轉(zhuǎn)換協(xié)議)
101 (SC_SWITCHING_PROTOCOLS)狀態(tài)碼是指服務(wù)器將按照其上的頭信息變?yōu)橐粋€(gè)不同的協(xié)議。這是 HTTP 1.1中新加入的母赵。
200 (OK/正常)
200 (SC_OK)的意思是一切正常逸爵。一般用于相應(yīng)GET和POST請求。這個(gè)狀態(tài)碼對servlet是缺省的凹嘲;如果沒有調(diào)用setStatus方法的話师倔,就會(huì)得到200。
201 (Created/已創(chuàng)建)
201 (SC_CREATED)表示服務(wù)器在請求的響應(yīng)中建立了新文檔周蹭;應(yīng)在定位頭信息中給出它的URL趋艘。
202 (Accepted/接受)
202 (SC_ACCEPTED)告訴客戶端請求正在被執(zhí)行疲恢,但還沒有處理完。
203 (Non-Authoritative Information/非官方信息)
狀態(tài)碼203 (SC_NON_AUTHORITATIVE_INFORMATION)是表示文檔被正常的返回瓷胧,但是由于正在使用的是文檔副本所以某些響應(yīng)頭信息可能不正確显拳。這是 HTTP 1.1中新加入的。
204 (No Content/無內(nèi)容)
在并沒有新文檔的情況下搓萧,204 (SC_NO_CONTENT)確保瀏覽器繼續(xù)顯示先前的文檔杂数。這各狀態(tài)碼對于用戶周期性的重載某一頁非常有用,并且你可以確定先前的頁面是否已經(jīng)更新瘸洛。例如揍移,某個(gè)servlet可能作如下操作:
int pageVersion =Integer.parseInt(request.getParameter("pageVersion"));
if (pageVersion >= currentVersion) {
response.setStatus(response.SC_NO_CONTENT);
} else {
// Create regular page
}
但是,這種方法對通過刷新響應(yīng)頭信息或等價(jià)的HTML標(biāo)記自動(dòng)重載的頁面起作用反肋,因?yàn)樗鼤?huì)返回一個(gè)204狀態(tài)碼停止以后的重載那伐。但基于JavaScript腳本的自動(dòng)重載在這種情況下仍然需要能夠起作用∈幔可以閱讀本書7.2 ( HTTP 1.1 Response Headers and Their Meaning/HTTP 1.1響應(yīng)頭信息以及他們的意義)部分的詳細(xì)討論罕邀。
205 (Reset Content/重置內(nèi)容)
重置內(nèi)容205 (SC_RESET_CONTENT)的意思是雖然沒有新文檔但瀏覽器要重置文檔顯示。這個(gè)狀態(tài)碼用于強(qiáng)迫瀏覽器清除表單域抓督。這是 HTTP 1.1中新加入的燃少。
206 (Partial Content/局部內(nèi)容)
206 (SC_PARTIAL_CONTENT)是在服務(wù)器完成了一個(gè)包含Range頭信息的局部請求時(shí)被發(fā)送的。這是 HTTP 1.1中新加入的铃在。
300 (Multiple Choices/多重選擇)
300 (SC_MULTIPLE_CHOICES)表示被請求的文檔可以在多個(gè)地方找到阵具,并將在返回的文檔中列出來。如果服務(wù)器有首選設(shè)置定铜,首選項(xiàng)將會(huì)被列于定位響應(yīng)頭信息中阳液。
301 (Moved Permanently)
301 (SC_MOVED_PERMANENTLY)狀態(tài)是指所請求的文檔在別的地方;文檔新的URL會(huì)在定位響應(yīng)頭信息中給出揣炕。瀏覽器會(huì)自動(dòng)連接到新的URL帘皿。
302 (Found/找到)
與301有些類似,只是定位頭信息中所給的URL應(yīng)被理解為臨時(shí)交換地址而不是永久的畸陡。注意:在 HTTP 1.0中鹰溜,消息是臨時(shí)移動(dòng)(Moved Temporarily)的而不是被找到,因此HttpServletResponse中的常量是SC_MOVED_TEMPORARILY不是我們以為的SC_FOUND丁恭。
注意
代表狀態(tài)碼302的常量是SC_MOVED_TEMPORARILY而不是SC_FOUND曹动。
狀態(tài)碼302是非常有用的因?yàn)闉g覽器自動(dòng)連接在定為響應(yīng)頭信息中給出的新URL。這非常有用牲览,而且為此有一個(gè)專門的方法——sendRedirect墓陈。使用response.sendRedirect(url)比調(diào)用 response.setStatus(response.SC_MOVED_TEMPORARILY)和 response.setHeader("Location", url)多幾個(gè)好處。首先,response.sendRedirect(url)方法明顯要簡單和容易贡必。第二兔港,servlet自動(dòng)建立一頁保存這一連接以提供給那些不能自動(dòng)轉(zhuǎn)向的瀏覽器顯示。最后仔拟,在servlet 2.2版本(J2EE中的版本)中衫樊,sendRedirect能夠處理相對路徑,自動(dòng)轉(zhuǎn)換為絕對路徑理逊。但是你只能在2.1版本中使用絕對路徑橡伞。
如果你將用戶轉(zhuǎn)向到站點(diǎn)的另一頁中,你要用 HttpServletResponse 中的 encodeURL 方法傳送URL晋被。這么做可預(yù)防不斷使用基于URL重寫的會(huì)話跟蹤的情況兑徘。URL重寫是一種在你的網(wǎng)站跟蹤不使用 cookies 的用戶的方法。這是通過在每一個(gè)URL尾部附加路徑信息實(shí)現(xiàn)的羡洛,但是 servlet 會(huì)話跟蹤API會(huì)自動(dòng)的注意這些細(xì)節(jié)挂脑。會(huì)話跟蹤在第九章討論,并且養(yǎng)成使用 encodeURL 的習(xí)慣會(huì)使以后添加會(huì)話跟蹤的功能更容易很多欲侮。
核心技巧
如果你將用戶轉(zhuǎn)向到你的站點(diǎn)的其他頁面崭闲,用 response.sendRedirect(response.encodeURL(url)) 的方式事先計(jì)劃好會(huì)話跟蹤(session tracking)要比只是調(diào)用 response.sendRedirect(url) 好的多。
這個(gè)狀態(tài)碼有時(shí)可以與301交換使用威蕉。例如刁俭,如果你錯(cuò)誤的訪問了http://host/~user(路徑信息不完整),有些服務(wù)器就會(huì)回復(fù)301狀態(tài)碼而有些則回復(fù)302韧涨。從技術(shù)上說牍戚,如果最初的請求是GET瀏覽器只是被假定自動(dòng)轉(zhuǎn)向。如果想了解更多細(xì)節(jié)虑粥,請看狀態(tài)碼307的討論如孝。
303 (See Other/參見其他信息)
這個(gè)狀態(tài)碼和 301、302 相似娩贷,只是如果最初的請求是 POST第晰,那么新文檔(在定位頭信息中給出)藥用 GET 找回。這個(gè)狀態(tài)碼是新加入 HTTP 1.1中的彬祖。
304 (Not Modified/為修正)
當(dāng)客戶端有一個(gè)緩存的文檔茁瘦,通過提供一個(gè) If-Modified-Since 頭信息可指出客戶端只希望文檔在指定日期之后有所修改時(shí)才會(huì)重載此文檔,用這種方式可以進(jìn)行有條件的請求储笑。304 (SC_NOT_MODIFIED)是指緩沖的版本已經(jīng)被更新并且客戶端應(yīng)刷新文檔甜熔。另外,服務(wù)器將返回請求的文檔及狀態(tài)碼 200南蓬。servlet一般情況下不會(huì)直接設(shè)置這個(gè)狀態(tài)碼纺非。它們會(huì)實(shí)現(xiàn)getLastModified方法并根據(jù)修正日期讓默認(rèn)服務(wù)方法處理有條件的請求。這個(gè)方法的例程已在2.8部分(An Example Using Servlet Initialization and Page Modification Dates/一個(gè)使用servlet初始化和頁面修正日期的例子)給出赘方。
305 (Use Proxy/使用代理)
305 (SC_USE_PROXY)表示所請求的文檔要通過定位頭信息中的代理服務(wù)器獲得烧颖。這個(gè)狀態(tài)碼是新加入 HTTP 1.1中的。
307 (Temporary Redirect/臨時(shí)重定向)
瀏覽器處理307狀態(tài)的規(guī)則與302相同窄陡。307狀態(tài)被加入到 HTTP 1.1中是由于許多瀏覽器在收到302響應(yīng)時(shí)即使是原始消息為POST的情況下仍然執(zhí)行了錯(cuò)誤的轉(zhuǎn)向炕淮。只有在收到303響應(yīng)時(shí)才假定瀏覽器會(huì)在POST請求時(shí)重定向。添加這個(gè)新的狀態(tài)碼的目的很明確:在響應(yīng)為303時(shí)按照GET和POST請求轉(zhuǎn)向跳夭;而在307響應(yīng)時(shí)則按照GET請求轉(zhuǎn)向而不是POST請求涂圆。注意:由于某些原因在HttpServletResponse中還沒有與這個(gè)狀態(tài)對應(yīng)的常量。該狀態(tài)碼是新加入HTTP 1.1中的币叹。
注意
在 HttpServletResponse 中沒有 SC_TEMPORARY_REDIRECT 常量润歉,所以你只能顯示的使用307狀態(tài)碼。
400 (Bad Request/錯(cuò)誤請求)
400 (SC_BAD_REQUEST)指出客戶端請求中的語法錯(cuò)誤颈抚。
401 (Unauthorized/未授權(quán))
401 (SC_UNAUTHORIZED)表示客戶端在授權(quán)頭信息中沒有有效的身份信息時(shí)訪問受到密碼保護(hù)的頁面踩衩。這個(gè)響應(yīng)必須包含一個(gè)WWW- Authenticate的授權(quán)信息頭。例如贩汉,在本書4.5部分中的“Restricting Access to Web Pages./限制訪問Web頁驱富。”
403 (Forbidden/禁止)
403 (SC_FORBIDDEN)的意思是除非擁有授權(quán)否則服務(wù)器拒絕提供所請求的資源匹舞。這個(gè)狀態(tài)經(jīng)常會(huì)由于服務(wù)器上的損壞文件或目錄許可而引起褐鸥。
404 (Not Found/未找到)
404 (SC_NOT_FOUND)狀態(tài)每個(gè)網(wǎng)絡(luò)程序員可能都遇到過,他告訴客戶端所給的地址無法找到任何資源赐稽。它是表示“沒有所訪問頁面”的標(biāo)準(zhǔn)方式叫榕。這個(gè)狀態(tài)碼是常用的響應(yīng)并且在HttpServletResponse類中有專門的方法實(shí)現(xiàn)它:sendError("message")。相對于 setStatus使用sendError得好處是:服務(wù)器會(huì)自動(dòng)生成一個(gè)錯(cuò)誤頁來顯示錯(cuò)誤信息又憨。但是翠霍,Internet Explorer 5瀏覽器卻默認(rèn)忽略你發(fā)揮的錯(cuò)誤頁面并顯示其自定義的錯(cuò)誤提示頁面,雖然微軟這么做違反了 HTTP 規(guī)范蠢莺。要關(guān)閉此功能寒匙,在工具菜單里,選擇Internet選項(xiàng)躏将,進(jìn)入高級標(biāo)簽頁锄弱,并確認(rèn)“顯示友好的 HTTP 錯(cuò)誤信息”選項(xiàng)(在我的瀏覽器中是倒數(shù)第8各選項(xiàng))沒有被選。但是很少有用戶知道此選項(xiàng)祸憋,因此這個(gè)特性被IE5隱藏了起來使用戶無法看到你所返回給用戶的信息会宪。而其他主流瀏覽器及IE4都完全的顯示服務(wù)器生成的錯(cuò)誤提示頁面◎强可以參考圖6-3及6-4中的例子掸鹅。
核心警告
默認(rèn)情況下塞帐,IE5忽略服務(wù)端生成的錯(cuò)誤提示頁面。
405 (Method Not Allowed/方法未允許)
405 (SC_METHOD_NOT_ALLOWED)指出請求方法(GET, POST, HEAD, PUT, DELETE, 等)對某些特定的資源不允許使用巍沙。該狀態(tài)碼是新加入 HTTP 1.1中的葵姥。
406 (Not Acceptable/無法訪問)
406 (SC_NOT_ACCEPTABLE)表示請求資源的MIME類型與客戶端中Accept頭信息中指定的類