天天看點

http請求頭、請求狀态碼、http響應頭詳解

1. http請求頭

HTTP客戶程式(例如浏覽器),向伺服器發送請求的時候必須指明請求類型(一般是GET或者POST)。如有必要,客戶程式還可以選擇發送其他的請求頭。

    Accept:浏覽器可接受的MIME類型。

    Accept-Charset:浏覽器可接受的字元集。

    Accept-Encoding:浏覽器能夠進行解碼的資料編碼方式,比如gzip。Servlet能夠向支援gzip的浏覽器傳回經gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載下傳時間。

    Accept-Language:浏覽器所希望的語言種類,當伺服器能夠提供一種以上的語言版本時要用到。

    Accept-Ranges:可以請求網頁實體的一個或者多個子範圍字段

    Authorization:授權資訊,通常出現在對伺服器發送的WWW-Authenticate頭的應答中。

    Cache-Control:指定請求和響應遵循的緩存機制

    Connection:表示是否需要持久連接配接。如果Servlet看到這裡的值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1預設進行持久連接配接),它就可以利用持久連接配接的優點,當頁面包含多個元素時(例如Applet,圖檔),顯著地減少下載下傳所需要的時間。要實作這一點,Servlet需要在應答中發送一個Content-Length頭,最簡單的實作方法是:先把内容寫入ByteArrayOutputStream,然後在正式寫出内容之前計算它的大小。

    Content-Length:表示請求消息正文的長度。

    Content-Type:請求的與實體對應的MIME資訊。

    Cookie:這是最重要的請求頭資訊之一。

    Date:請求發送的日期和時間。

    Expect:請求的特定的伺服器行為。

    From:請求發送者的email位址,由一些特殊的Web客戶程式使用,浏覽器不會用到它。

    Host:初始URL中的主機和端口。

    If-Match:隻有請求内容與實體相比對才有效。

    If-Modified-Since:隻有當所請求的内容在指定的日期之後又經過修改才傳回它,否則傳回304“Not Modified”應答。

    If-None-Match:如果内容未改變傳回304代碼,參數為伺服器先前發送的Etag,與伺服器回應的Etag比較判斷是否改變。

    If-Range:如果實體未改變,伺服器發送用戶端丢失的部分,否則發送整個實體。參數也為Etag。

    If-Unmodified-Since:隻在實體在指定時間之後未被修改才請求成功。

    Max-Forwards:限制資訊通過代理和網關傳送的時間。

    Pragma:指定“no-cache”值表示伺服器必須傳回一個重新整理後的文檔,即使它是代理伺服器而且已經有了頁面的本地拷貝。

    Proxy-Authorization:連接配接到代理的授權證書。

    Range:隻請求實體的一部分,指定範圍。

    Referer:包含一個URL,使用者從該URL代表的頁面出發通路目前請求的頁面。

    TE:用戶端願意接受的傳輸編碼,并通知伺服器接受接受尾加頭資訊。

    Upgrade:向伺服器指定某種傳輸協定以便伺服器進行轉換(如果支援)。

    User-Agent:浏覽器類型,如果Servlet傳回的内容與浏覽器類型有關則該值非常有用。

    UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏覽器所發送的非标準的請求頭,表示螢幕大小、顔色深度、作業系統和CPU類型。

    Via: 通知中間網關或代理伺服器位址,通信協定。

    Warning: 關于消息實體的警告資訊。

2. 請求狀态碼

1** 資訊,伺服器收到請求,需要請求者繼續執行操作.

2** 成功,操作被成功接收并處理。

3** 重定向,需要進一步的操作以完成請求。

4** 用戶端錯誤,請求包含文法錯誤或無法完成請求。

5** 伺服器錯誤,伺服器在處理請求的過程中發生了錯誤。

    100 用戶端應當繼續發送請求。這個臨時響應是用來通知用戶端它的部分請求已經被伺服器接收,且仍未被拒絕。用戶端應當繼續發送請求的剩餘部分,或者如果請求已經完成,忽略這個響應。伺服器必須在請求完成後向用戶端發送一個最終響應。

    101 伺服器已經了解了用戶端的請求,并将通過Upgrade 消息頭通知用戶端采用不同的協定來完成這個請求。在發送完這個響應最後的空行後,伺服器将會切換到在Upgrade 消息頭中定義的那些協定。   隻有在切換新的協定更有好處的時候才應該采取類似措施。例如,切換到新的HTTP 版本比舊版本更有優勢,或者切換到一個實時且同步的協定以傳送利用此類特性的資源。

    102 由WebDAV(RFC 2518)擴充的狀态碼,代表處理将被繼續執行。

    200 請求已成功,請求所希望的響應頭或資料體将随此響應傳回。

    201 請求已經被實作,而且有一個新的資源已經依據請求的需要而建立,且其 URI 已經随Location 頭資訊傳回。假如需要的資源無法及時建立的話,應當傳回 ‘202 Accepted’。

    202 伺服器已接受請求,但尚未處理。正如它可能被拒絕一樣,最終該請求可能會也可能不會被執行。在異步操作的場合下,沒有比發送這個狀态碼更友善的做法了。   傳回202狀态碼的響應的目的是允許伺服器接受其他過程的請求(例如某個每天隻執行一次的基于批處理的操作),而不必讓用戶端一直保持與伺服器的連接配接直到批處理操作全部完成。在接受請求處理并傳回202狀态碼的響應應當在傳回的實體中包含一些訓示處理目前狀态的資訊,以及指向處理狀态螢幕或狀态預測的指針,以便使用者能夠估計操作是否已經完成。

    203 伺服器已成功處理了請求,但傳回的實體頭部元資訊不是在原始伺服器上有效的确定集合,而是來自本地或者第三方的拷貝。目前的資訊可能是原始版本的子集或者超集。例如,包含資源的中繼資料可能導緻原始伺服器知道元資訊的超級。使用此狀态碼不是必須的,而且隻有在響應不使用此狀态碼便會傳回200 OK的情況下才是合适的。

    204 伺服器成功處理了請求,但不需要傳回任何實體内容,并且希望傳回更新了的元資訊。響應可能通過實體頭部的形式,傳回新的或更新後的元資訊。如果存在這些頭部資訊,則應當與所請求的變量相呼應。   如果用戶端是浏覽器的話,那麼使用者浏覽器應保留發送了該請求的頁面,而不産生任何文檔視圖上的變化,即使按照規範新的或更新後的元資訊應當被應用到使用者浏覽器活動視圖中的文檔。   由于204響應被禁止包含任何消息體,是以它始終以消息頭後的第一個空行結尾。

    205 伺服器成功處理了請求,且沒有傳回任何内容。但是與204響應不同,傳回此狀态碼的響應要求請求者重置文檔視圖。該響應主要是被用于接受使用者輸入後,立即重置表單,以便使用者能夠輕松地開始另一次輸入。   與204響應一樣,該響應也被禁止包含任何消息體,且以消息頭後的第一個空行結束。

    206 伺服器已經成功處理了部分 GET 請求。類似于 FlashGet 或者迅雷這類的 HTTP 下載下傳工具都是使用此類響應實作斷點續傳或者将一個大文檔分解為多個下載下傳段同時下載下傳。   該請求必須包含 Range 頭資訊來訓示用戶端希望得到的内容範圍,并且可能包含 If-Range 來作為請求條件。   響應必須包含如下的頭部域:   Content-Range 用以訓示本次響應中傳回的内容的範圍;如果是 Content-Type 為 multipart/byteranges 的多段下載下傳,則每一 multipart 段中都應包含 Content-Range 域用以訓示本段的内容範圍。假如響應中包含 Content-Length,那麼它的數值必須比對它傳回的内容範圍的真實位元組數。   Date   ETag 和/或 Content-Location,假如同樣的請求本應該傳回200響應。   Expires, Cache-Control,和/或 Vary,假如其值可能與之前相同變量的其他響應對應的值不同的話。   假如本響應請求使用了 If-Range 強緩存驗證,那麼本次響應不應該包含其他實體頭;假如本響應的請求使用了 If-Range 弱緩存驗證,那麼本次響應禁止包含其他實體頭;這避免了緩存的實體内容和更新了的實體頭資訊之間的不一緻。否則,本響應就應當包含所有本應該傳回200響應中應當傳回的所有實體頭部域。   假如 ETag 或 Last-Modified 頭部不能精确比對的話,則用戶端緩存應禁止将206響應傳回的内容與之前任何緩存過的内容組合在一起。   任何不支援 Range 以及 Content-Range 頭的緩存都禁止緩存206響應傳回的内容。

    207 由WebDAV(RFC 2518)擴充的狀态碼,代表之後的消息體将是一個XML消息,并且可能依照之前子請求數量的不同,包含一系列獨立的響應代碼。

    300 被請求的資源有一系列可供選擇的回饋資訊,每個都有自己特定的位址和浏覽器驅動的商議資訊。使用者或浏覽器能夠自行選擇一個首選的位址進行重定向。   除非這是一個 HEAD 請求,否則該響應應當包括一個資源特性及位址的清單的實體,以便使用者或浏覽器從中選擇最合适的重定向位址。這個實體的格式由 Content-Type 定義的格式所決定。浏覽器可能根據響應的格式以及浏覽器自身能力,自動作出最合适的選擇。當然,RFC 2616規範并沒有規定這樣的自動選擇該如何進行。   如果伺服器本身已經有了首選的回饋選擇,那麼在 Location 中應當指明這個回饋的 URI;浏覽器可能會将這個 Location 值作為自動重定向的位址。此外,除非額外指定,否則這個響應也是可緩存的。

    301 被請求的資源已永久移動到新位置,并且将來任何對此資源的引用都應該使用本響應傳回的若幹個 URI 之一。如果可能,擁有連結編輯功能的用戶端應當自動把請求的位址修改為從伺服器回報回來的位址。除非額外指定,否則這個響應也是可緩存的。   新的永久性的 URI 應當在響應的 Location 域中傳回。除非這是一個 HEAD 請求,否則響應的實體中應當包含指向新的 URI 的超連結及簡短說明。   如果這不是一個 GET 或者 HEAD 請求,是以浏覽器禁止自動進行重定向,除非得到使用者的确認,因為請求的條件可能是以發生變化。   注意:對于某些使用 HTTP/1.0 協定的浏覽器,當它們發送的 POST 請求得到了一個301響應的話,接下來的重定向請求将會變成 GET 方式。

    302 請求的資源現在臨時從不同的 URI 響應請求。由于這樣的重定向是臨時的,用戶端應當繼續向原有位址發送以後的請求。隻有在Cache-Control或Expires中進行了指定的情況下,這個響應才是可緩存的。   新的臨時性的 URI 應當在響應的 Location 域中傳回。除非這是一個 HEAD 請求,否則響應的實體中應當包含指向新的 URI 的超連結及簡短說明。   如果這不是一個 GET 或者 HEAD 請求,那麼浏覽器禁止自動進行重定向,除非得到使用者的确認,因為請求的條件可能是以發生變化。   注意:雖然RFC 1945和RFC 2068規範不允許用戶端在重定向時改變請求的方法,但是很多現存的浏覽器将302響應視作為303響應,并且使用 GET 方式通路在 Location 中規定的 URI,而無視原先請求的方法。狀态碼303和307被添加了進來,用以明确伺服器期待用戶端進行何種反應。

    303 對應目前請求的響應可以在另一個 URI 上被找到,而且用戶端應當采用 GET 的方式通路那個資源。這個方法的存在主要是為了允許由腳本激活的POST請求輸出重定向到一個新的資源。這個新的 URI 不是原始資源的替代引用。同時,303響應禁止被緩存。當然,第二個請求(重定向)可能被緩存。   新的 URI 應當在響應的 Location 域中傳回。除非這是一個 HEAD 請求,否則響應的實體中應當包含指向新的 URI 的超連結及簡短說明。   注意:許多 HTTP/1.1 版以前的 浏覽器不能正确了解303狀态。如果需要考慮與這些浏覽器之間的互動,302狀态碼應該可以勝任,因為大多數的浏覽器處理302響應時的方式恰恰就是上述規範要求用戶端處理303響應時應當做的。

    304 如果用戶端發送了一個帶條件的 GET 請求且該請求已被允許,而文檔的内容(自上次通路以來或者根據請求的條件)并沒有改變,則伺服器應當傳回這個狀态碼。304響應禁止包含消息體,是以始終以消息頭後的第一個空行結尾。   該響應必須包含以下的頭資訊:   Date,除非這個伺服器沒有時鐘。假如沒有時鐘的伺服器也遵守這些規則,那麼代理伺服器以及用戶端可以自行将 Date 字段添加到接收到的響應頭中去(正如RFC 2068中規定的一樣),緩存機制将會正常工作。   ETag 和/或 Content-Location,假如同樣的請求本應傳回200響應。   Expires, Cache-Control,和/或Vary,假如其值可能與之前相同變量的其他響應對應的值不同的話。   假如本響應請求使用了強緩存驗證,那麼本次響應不應該包含其他實體頭;否則(例如,某個帶條件的 GET 請求使用了弱緩存驗證),本次響應禁止包含其他實體頭;這避免了緩存了的實體内容和更新了的實體頭資訊之間的不一緻。   假如某個304響應指明了目前某個實體沒有緩存,那麼緩存系統必須忽視這個響應,并且重複發送不包含限制條件的請求。   假如接收到一個要求更新某個緩存條目的304響應,那麼緩存系統必須更新整個條目以反映所有在響應中被更新的字段的值。

    305 被請求的資源必須通過指定的代理才能被通路。Location 域中将給出指定的代理所在的 URI 資訊,接收者需要重複發送一個單獨的請求,通過這個代理才能通路相應資源。隻有原始伺服器才能建立305響應。   注意:RFC 2068中沒有明确305響應是為了重定向一個單獨的請求,而且隻能被原始伺服器建立。忽視這些限制可能導緻嚴重的安全後果。

    306 在最新版的規範中,306狀态碼已經不再被使用。

    307 請求的資源現在臨時從不同的URI 響應請求。由于這樣的重定向是臨時的,用戶端應當繼續向原有位址發送以後的請求。隻有在Cache-Control或Expires中進行了指定的情況下,這個響應才是可緩存的。   新的臨時性的URI 應當在響應的 Location 域中傳回。除非這是一個HEAD 請求,否則響應的實體中應當包含指向新的URI 的超連結及簡短說明。因為部分浏覽器不能識别307響應,是以需要添加上述必要資訊以便使用者能夠了解并向新的 URI 發出通路請求。   如果這不是一個GET 或者 HEAD 請求,那麼浏覽器禁止自動進行重定向,除非得到使用者的确認,因為請求的條件可能是以發生變化。

    400 1、語義有誤,目前請求無法被伺服器了解。除非進行修改,否則用戶端不應該重複送出這個請求。   2、請求參數有誤。

    401 目前請求需要使用者驗證。該響應必須包含一個适用于被請求資源的 WWW-Authenticate 資訊頭用以詢問使用者資訊。用戶端可以重複送出一個包含恰當的 Authorization 頭資訊的請求。如果目前請求已經包含了 Authorization 證書,那麼401響應代表着伺服器驗證已經拒絕了那些證書。如果401響應包含了與前一個響應相同的身份驗證詢問,且浏覽器已經至少嘗試了一次驗證,那麼浏覽器應當向使用者展示響應中包含的實體資訊,因為這個實體資訊中可能包含了相關診斷資訊。參見RFC 2617。

    402 該狀态碼是為了将來可能的需求而預留的。

    403 伺服器已經了解請求,但是拒絕執行它。與401響應不同的是,身份驗證并不能提供任何幫助,而且這個請求也不應該被重複送出。如果這不是一個 HEAD 請求,而且伺服器希望能夠講清楚為何請求不能被執行,那麼就應該在實體内描述拒絕的原因。當然伺服器也可以傳回一個404響應,假如它不希望讓用戶端獲得任何資訊。

    404 請求失敗,請求所希望得到的資源未被在伺服器上發現。沒有資訊能夠告訴使用者這個狀況到底是暫時的還是永久的。假如伺服器知道情況的話,應當使用410狀态碼來告知舊資源因為某些内部的配置機制問題,已經永久的不可用,而且沒有任何可以跳轉的位址。404這個狀态碼被廣泛應用于當伺服器不想揭示到底為何請求被拒絕或者沒有其他适合的響應可用的情況下。

    405 請求行中指定的請求方法不能被用于請求相應的資源。該響應必須傳回一個Allow 頭資訊用以表示出目前資源能夠接受的請求方法的清單。   鑒于 PUT,DELETE 方法會對伺服器上的資源進行寫操作,因而絕大部分的網頁伺服器都不支援或者在預設配置下不允許上述請求方法,對于此類請求均會傳回405錯誤。

    406 請求的資源的内容特性無法滿足請求頭中的條件,因而無法生成響應實體。   除非這是一個 HEAD 請求,否則該響應就應當傳回一個包含可以讓使用者或者浏覽器從中選擇最合适的實體特性以及位址清單的實體。實體的格式由 Content-Type 頭中定義的媒體類型決定。浏覽器可以根據格式及自身能力自行作出最佳選擇。但是,規範中并沒有定義任何作出此類自動選擇的标準。

    407  與401響應類似,隻不過用戶端必須在代理伺服器上進行身份驗證。代理伺服器必須傳回一個 Proxy-Authenticate 用以進行身份詢問。用戶端可以傳回一個 Proxy-Authorization 資訊頭用以驗證。參見RFC 2617。

    408 請求逾時。用戶端沒有在伺服器預備等待的時間内完成一個請求的發送。用戶端可以随時再次送出這一請求而無需進行任何更改。

    409 由于和被請求的資源的目前狀态之間存在沖突,請求無法完成。這個代碼隻允許用在這樣的情況下才能被使用:使用者被認為能夠解決沖突,并且會重新送出新的請求。該響應應當包含足夠的資訊以便使用者發現沖突的源頭。   沖突通常發生于對 PUT 請求的進行中。例如,在采用版本檢查的環境下,某次 PUT 送出的對特定資源的修改請求所附帶的版本資訊與之前的某個(第三方)請求向沖突,那麼此時伺服器就應該傳回一個409錯誤,告知使用者請求無法完成。此時,響應實體中很可能會包含兩個沖突版本之間的差異比較,以便使用者重新送出歸并以後的新版本。

    410 被請求的資源在伺服器上已經不再可用,而且沒有任何已知的轉發位址。這樣的狀況應當被認為是永久性的。如果可能,擁有連結編輯功能的用戶端應當在獲得使用者許可後删除所有指向這個位址的引用。如果伺服器不知道或者無法确定這個狀況是否是永久的,那麼就應該使用404狀态碼。除非額外說明,否則這個響應是可緩存的。   410響應的目的主要是幫助網站管理者維護網站,通知使用者該資源已經不再可用,并且伺服器擁有者希望所有指向這個資源的遠端連接配接也被删除。這類事件在限時、增值服務中很普遍。同樣,410響應也被用于通知用戶端在目前伺服器站點上,原本屬于某個個人的資源已經不再可用。當然,是否需要把所有永久不可用的資源标記為’410 Gone’,以及是否需要保持此标記多長時間,完全取決于伺服器擁有者。

    411 伺服器拒絕在沒有定義 Content-Length 頭的情況下接受請求。在添加了表明請求消息體長度的有效 Content-Length 頭之後,用戶端可以再次送出該請求。

    412 伺服器在驗證在請求的頭字段中給出先決條件時,沒能滿足其中的一個或多個。這個狀态碼允許用戶端在擷取資源時在請求的元資訊(請求頭字段資料)中設定先決條件,以此避免該請求方法被應用到其希望的内容以外的資源上。

    413 伺服器拒絕處理目前請求,因為該請求送出的實體資料大小超過了伺服器願意或者能夠處理的範圍。此種情況下,伺服器可以關閉連接配接以免用戶端繼續發送此請求。   如果這個狀況是臨時的,伺服器應當傳回一個 Retry-After 的響應頭,以告知用戶端可以在多少時間以後重新嘗試。

    414 請求的URI 長度超過了伺服器能夠解釋的長度,是以伺服器拒絕對該請求提供服務。這比較少見,通常的情況包括:   本應使用POST方法的表單送出變成了GET方法,導緻查詢字元串(Query String)過長。   重定向URI “黑洞”,例如每次重定向把舊的 URI 作為新的 URI 的一部分,導緻在若幹次重定向後 URI 超長。   用戶端正在嘗試利用某些伺服器中存在的安全漏洞攻擊伺服器。這類伺服器使用固定長度的緩沖讀取或操作請求的 URI,當 GET 後的參數超過某個數值後,可能會産生緩沖區溢出,導緻任意代碼被執行[1]。沒有此類漏洞的伺服器,應當傳回414狀态碼。

    415 對于目前請求的方法和所請求的資源,請求中送出的實體并不是伺服器中所支援的格式,是以請求被拒絕。

    416 如果請求中包含了 Range 請求頭,并且 Range 中指定的任何資料範圍都與目前資源的可用範圍不重合,同時請求中又沒有定義 If-Range 請求頭,那麼伺服器就應當傳回416狀态碼。   假如 Range 使用的是位元組範圍,那麼這種情況就是指請求指定的所有資料範圍的首位元組位置都超過了目前資源的長度。伺服器也應當在傳回416狀态碼的同時,包含一個 Content-Range 實體頭,用以指明目前資源的長度。這個響應也被禁止使用 multipart/byteranges 作為其 Content-Type。

    417 在請求頭 Expect 中指定的預期内容無法被伺服器滿足,或者這個伺服器是一個代理伺服器,它有明顯的證據證明在目前路由的下一個節點上,Expect 的内容無法被滿足。

    421 從目前用戶端所在的IP位址到伺服器的連接配接數超過了伺服器許可的最大範圍。通常,這裡的IP位址指的是從伺服器上看到的用戶端位址(比如使用者的網關或者代理伺服器位址)。在這種情況下,連接配接數的計算可能涉及到不止一個終端使用者。

    422 從目前用戶端所在的IP位址到伺服器的連接配接數超過了伺服器許可的最大範圍。通常,這裡的IP位址指的是從伺服器上看到的用戶端位址(比如使用者的網關或者代理伺服器位址)。在這種情況下,連接配接數的計算可能涉及到不止一個終端使用者。

    422 請求格式正确,但是由于含有語義錯誤,無法響應。(RFC 4918 WebDAV)423 Locked   目前資源被鎖定。(RFC 4918 WebDAV)

    424 由于之前的某個請求發生的錯誤,導緻目前請求失敗,例如 PROPPATCH。(RFC 4918 WebDAV)

    425 在WebDav Advanced Collections 草案中定義,但是未出現在《WebDAV 順序集協定》(RFC 3658)中。

    426 用戶端應當切換到TLS/1.0。(RFC 2817)

    449 由微軟擴充,代表請求應當在執行完适當的操作後進行重試。

    500 伺服器遇到了一個未曾預料的狀況,導緻了它無法完成對請求的處理。一般來說,這個問題都會在伺服器的程式碼出錯時出現。

    501 伺服器不支援目前請求所需要的某個功能。當伺服器無法識别請求的方法,并且無法支援其對任何資源的請求。

    502 作為網關或者代理工作的伺服器嘗試執行請求時,從上遊伺服器接收到無效的響應。

    503 由于臨時的伺服器維護或者過載,伺服器目前無法處理請求。這個狀況是臨時的,并且将在一段時間以後恢複。如果能夠預計延遲時間,那麼響應中可以包含一個 Retry-After 頭用以标明這個延遲時間。如果沒有給出這個 Retry-After 資訊,那麼用戶端應當以處理500響應的方式處理它。   注意:503狀态碼的存在并不意味着伺服器在過載的時候必須使用它。某些伺服器隻不過是希望拒絕用戶端的連接配接。

    504 作為網關或者代理工作的伺服器嘗試執行請求時,未能及時從上遊伺服器(URI辨別出的伺服器,例如HTTP、FTP、LDAP)或者輔助伺服器(例如DNS)收到響應。   注意:某些代理伺服器在DNS查詢逾時時會傳回400或者500錯誤

    505 伺服器不支援,或者拒絕支援在請求中使用的 HTTP 版本。這暗示着伺服器不能或不願使用與用戶端相同的版本。響應中應當包含一個描述了為何版本不被支援以及伺服器支援哪些協定的實體。

    506 由《透明内容協商協定》(RFC 2295)擴充,代表伺服器存在内部配置錯誤:被請求的協商變元資源被配置為在透明内容協商中使用自己,是以在一個協商進行中不是一個合适的重點。

    507 伺服器無法存儲完成請求所必須的内容。這個狀況被認為是臨時的。WebDAV (RFC 4918)

    509 伺服器達到帶寬限制。這不是一個官方的狀态碼,但是仍被廣泛使用。

    510 擷取資源所需要的政策并沒有沒滿足。(RFC 2774)

3. 響應頭

Web伺服器的HTTP應答一般由以下幾項構成:一個狀态行,一個或多個應答頭,一個空行,内容文檔。設定HTTP應答頭往往和設定狀态行中的狀态代碼結合起來。例如,有好幾個表示“文檔位置已經改變”的狀态代碼都伴随着一個Location頭,而401(Unauthorized)狀态代碼則必須伴随一個WWW-Authenticate頭。

然而,即使在沒有設定特殊含義的狀态代碼時,指定應答頭也是很有用的。應答頭可以用來完成:設定Cookie,指定修改日期,訓示浏覽器按照指定的間隔重新整理頁面,聲明文檔的長度以便利用持久HTTP連接配接,……等等許多其他任務。

設定應答頭最常用的方法是HttpServletResponse的setHeader,該方法有兩個參數,分别表示應答頭的名字和值。和設定狀态代碼相似,設定應答頭應該在發送任何文檔内容之前進行。

Accept-Ranges:表明伺服器是否支援指定範圍請求及哪種類型的分段請求。

Age:從原始伺服器到代理緩存形成的估算時間(以秒計,非負)。

    Allow 伺服器支援哪些請求方法(如GET、POST等)。

    Cache-Control:告訴所有的緩存機制是否可以緩存及哪種類型。

    Content-Encoding 文檔的編碼(Encode)方法。隻有在解碼之後才可以得到Content-Type頭指定的内容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載下傳時間。Java的GZIPOutputStream可以很友善地進行gzip壓縮,但隻有Unix上的Netscape和Windows上的IE 4、IE 5才支援它。是以,Servlet應該通過檢視Accept-Encoding頭(即request.getHeader(“Accept-Encoding”))檢查浏覽器是否支援gzip,為支援gzip的浏覽器傳回經gzip壓縮的HTML頁面,為其他浏覽器傳回普通頁面。

    Content-Language:響應體的語言。

    Content-Length 表示内容長度。隻有當浏覽器使用持久HTTP連接配接時才需要這個資料。如果你想要利用持久連接配接的優勢,可以把輸出文檔寫入ByteArrayOutputStram,完成後檢視其大小,然後把該值放入Content-Length頭,最後通過byteArrayStream.writeTo(response.getOutputStream()發送内容。

    Content-Location:請求資源可替代的備用的另一位址。

    Content-MD5:傳回資源的MD5校驗值。

    Content-Range:在整個傳回體中本部分的位元組位置。

    Content-Type 表示後面的文檔屬于什麼MIME類型。Servlet預設為text/plain,但通常需要顯式地指定為text/html。由于經常要設定Content-Type,是以HttpServletResponse提供了一個專用的方法setContentType。

    Date 目前的GMT時間。你可以用setDateHeader來設定這個頭以避免轉換時間格式的麻煩。

    Expires 應該在什麼時候認為文檔已經過期,進而不再緩存它?

    Last-Modified 文檔的最後改動時間。客戶可以通過If-Modified-Since請求頭提供一個日期,該請求将被視為一個條件GET,隻有改動時間遲于指定時間的文檔才會傳回,否則傳回一個304(Not Modified)狀态。Last-Modified也可用setDateHeader方法來設定。

    Location 表示客戶應當到哪裡去提取文檔。Location通常不是直接設定的,而是通過HttpServletResponse的sendRedirect方法,該方法同時設定狀态代碼為302。

    Pragma:包括實作特定的指令,它可應用到響應鍊上的任何接收方。

    Proxy-Authenticate:它指出認證方案和可應用到代理的該URL上的參數。

    Refresh 表示浏覽器應該在多少時間之後重新整理文檔,以秒計。除了重新整理目前文檔之外,你還可以通過setHeader(“Refresh”, “5; URL=http://host/path")讓浏覽器讀取指定的頁面。注意這種功能通常是通過設定HTML頁面HEAD區的實作,這是因為,自動重新整理或重定向對于那些不能使用CGI或Servlet的HTML編寫者十分重要。但是,對于Servlet來說,直接設定Refresh頭更加友善。注意Refresh的意義是“N秒之後重新整理本頁面或通路指定頁面”,而不是“每隔N秒重新整理本頁面或通路指定頁面”。是以,連續重新整理要求每次都發送一個Refresh頭,而發送204狀态代碼則可以阻止浏覽器繼續重新整理,不管是使用Refresh頭還是。注意Refresh頭不屬于HTTP 1.1正式規範的一部分,而是一個擴充,但Netscape和IE都支援它。

    Retry-After:如果實體暫時不可取,通知用戶端在指定時間之後再次嘗試。

    Server 伺服器名字。Servlet一般不設定這個值,而是由Web伺服器自己設定。

    Set-Cookie 設定和頁面關聯的Cookie。Servlet不應使用response.setHeader(“Set-Cookie”, …),而是應使用HttpServletResponse提供的專用方法addCookie。參見下文有關Cookie設定的讨論。

    Trailer:指出頭域在分塊傳輸編碼的尾部存在。

    Transfer-Encoding:檔案傳輸編碼。

    Vary:告訴下遊代理是使用緩存響應還是從原始伺服器請求。

    Via:告知代理用戶端響應是通過哪裡發送的。

    Warning:警告實體可能存在的問題。

    WWW-Authenticate 客戶應該在Authorization頭中提供什麼類型的授權資訊?在包含401(Unauthorized)狀态行的應答中這個頭是必需的。例如,response.setHeader(“WWW-Authenticate”, “BASIC realm=\”executives\””)。注意Servlet一般不進行這方面的處理,而是讓Web伺服器的專門機制來控制受密碼保護頁面的通路(例如.htaccess)。

原文連結:https://blog.csdn.net/AndCo/article/details/80391167