學習Java的同學注意了?。?!
學習進程中遇到甚么問題或想獲得學習資源的話,歡迎加入Java學習交換群,群號碼:183993990 我們1起學Java!
引言
http(超文本傳輸協議)是1個基于要求與響應模式的、無狀態的、利用層的協議,常基于TCP的連接方式。HTTP協議的主要特點是:
1.支持客戶/服務器模式。
2.簡單快速:客戶向服務器要求服務時,只需傳送要求方法和路徑。由于HTTP協議簡單,通訊速度很快。
3.靈活:HTTP允許傳輸任意類型的數據對象。類型由Content-Type加以標記。
4.無連接:即每次連接只處理1個要求,處理完客戶的要求,并收到客戶的應對后,即斷開連接。采取這類方式可以節省傳輸時間。
5.無狀態:無狀態是指協議對事務處理沒有記憶能力。
http1.0協議默許的是非持久連接, HTTP1.1默許的連接方式為持久連接。
非持久連接:每次服務器發出1個對象后,相應的TCP連接就被關閉,也就是說每一個連接都沒有延續到可用于傳送其他對象。每一個TCP連接只用于傳輸1個要求消息和1個響應消息。
持久連接:服務器在發出響應后讓TCP連接繼續打開著。同1對客戶/服務器之間的后續要求和響應可以通過這個連接發送。HTTP/1.1的默許模式使用帶流水線的持久連接。
1、HTTP協議詳解之要求
//要求行 POST /reg.jsp HTTP/ (CRLF) //消息報頭 Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF) Accept-Language:zh-cn (CRLF) Accept-Encoding:gzip,deflate (CRLF) If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF) If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF) User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF) Host:www.guet.edu.cn (CRLF) Connection:Keep-Alive (CRLF) (CRLF) //要求正文 user=jeffrey&pwd=1234
以上是http要求的3部:要求行、消息報頭、要求正文。
要求行以1個方法符號開頭,以空格分開,后面隨著要求的URI和協議的版本,格式以下:
Method Request-URI HTTP-Version CRLF
其中 Method表示要求方法(如POST、GET、PUT、DELETE等);Request-URI是1個統1資源標識符;HTTP-Version表示要求的HTTP協議版本;CRLF表示回車和換行。
2、HTTP協議詳解之響應篇
//狀態行 HTTP/1.1 200 OK (CRLF) //消息報頭 Cache-Control: private, max-age=30 Content-Type: text/html; charset=utf⑻ Content-Encoding: gzip Expires: Mon, 25 May 2009 03:20:33 GMT Last-Modified: Mon, 25 May 2009 03:20:03 GMT Vary: Accept-Encoding Server: Microsoft-IIS/7.0 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET Date: Mon, 25 May 2009 03:20:02 GMT Content-Length: 12173 //響應正文 略
HTTP響應也是由3個部份組成,分別是:狀態行、消息報頭、響應正文
狀態行格式以下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描寫。
常見狀態代碼、狀態描寫、說明:
200 OK //客戶端要求成功
400 Bad Request //客戶端要求有語法毛病,不能被服務器所理解
401 Unauthorized //要求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域1起使用
403 Forbidden //服務器收到要求,但是謝絕提供服務
404 Not Found //要求資源不存在,eg:輸入了毛病的URL
500 Internal Server Error //服務器產生不可預期的毛病
503 Server Unavailable //服務器當前不能處理客戶真個要求,1段時間后可能恢復正常
3、HTTP協議詳解之消息報頭
HTTP消息由客戶端到服務器的要求和服務器到客戶真個響應組成。要求消息和響應消息都是由開始行(對要求消息,開始行就是要求行;對響應消息,開始行就是狀態行),消息報頭(可選),空行(只有CRLF的行),消息正文(可選)組成。
HTTP消息報頭包括普通報頭、要求報頭、響應報頭、實體報頭。每個報頭域都是由名字+“:”+空格+值 組成,消息報頭域的名字是大小寫無關的。
1、要求報頭
要求報頭允許客戶端向服務器端傳遞要求的附加信息和客戶端本身的信息。
經常使用的要求報頭
Accept要求報頭域用于指定客戶端接受哪些類型的信息。
Accept-Charset要求報頭域用于指定客戶端接受的字符集。
Accept-Encoding要求報頭域類似于Accept,但是它是用于指定可接受的內容編碼。
Accept-Language要求報頭域類似于Accept,但是它是用于指定1種自然語言。
Authorization要求報頭域主要用于證明客戶端有權查看某個資源。
Host要求報頭域主要用于指定被要求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的。User-Agent要求報頭域允許客戶端將它的操作系統、閱讀器和其它屬性告知服務器。
2、響應報頭
響應報頭允許服務器傳遞不能放在狀態行中的附加響應信息,和關于服務器的信息和對Request-URI所標識的資源進行下1步訪問的信息。
經常使用的響應報頭
Location響應報頭域用于重定向接受者到1個新的位置。Location響應報頭域經常使用在更換域名的時候。
Server響應報頭域包括了服務器用來處理要求的軟件信息
3. 實體報頭
要求和響應消息都可以傳送1個實體。
經常使用的實體報頭
Content-Encoding唆使已被利用到實體正文的附加內容的編碼。
Content-Language實體報頭域描寫了資源所用的自然語言。
Content-Length實體報頭域用于指明實體正文的長度,以字節方式存儲的10進制數字來表示。
Content-Type實體報頭域用語指明發送給接收者的實體正文的媒體類型。
Last-Modified實體報頭域用于唆使資源的最后修改日期和時間。
Expires實體報頭域給出響應過期的日期和時間。
4、補充
1、HTTP協議Content Lenth限制漏洞致使謝絕服務攻擊
使用POST方法時,可以設置ContentLenth來定義需要傳送的數據長度,例如ContentLenth:999999999,在傳送完成前,內 存不會釋放,攻擊者可以利用這個缺點,連續向WEB服務器發送垃圾數據直至WEB服務器內存耗盡。這類攻擊方法基本不會留下痕跡。
2、為了提高用戶使用閱讀器時的性能,現代閱讀器還支持并發的訪問方式,閱讀1個網頁時同時建立多個連接,以迅速取得1個網頁上的多個圖標,這樣能更快速完成全部網頁的傳輸。HTTP1.1中提供了這類延續連接的方式,而下1代HTTP協議:HTTP-NG更增加了有關會話控制、豐富的內容協商等方式的支持,來提供更高效力的連接。
5.Java利用HTTP協議實現聯網和下載
Url的要求連接(Get方式)
String currentUrl=“http://www.myWeb.com/login.jsp?userName='Devin'&passWord='mypassword'”; //URL ?后面的內容為HTTP要求的正文
URL url = new URL(currentUrl);
HttpURLConnection httpurlconnection = url.openConnection();
//下面的設置對應HTTP要求中的消息報頭 httpurlconnection.setRequestProperty("User-Agent",CommonValues.User_Agent); httpurlconnection.setRequestProperty("Accept",CommonValues.Accept); httpurlconnection.setRequestProperty("Accept-Charset",CommonValues.Accept_Charset); httpurlconnection.setRequestProperty("Accept-Language",CommonValues.Accept_Language); httpurlconnection.setRequestProperty("Connection",CommonValues.Connection); httpurlconnection.setRequestProperty("Keep-Alive",CommonValues.Keep_Alive); httpurlconnection.setConnectTimeout(CommonValues.ConnectionTimeOut); httpurlconnection.setReadTimeout(CommonValues.ReadTimeOut); httpurlconnection.connect(); int responsecode = httpurlconnection.getResponseCode(); if(responsecode == HttpURLConnection.HTTP_OK) //對應HTTP響應中狀態行的響應碼
{ //操作要求流,這里對應HTTP響應中的響應正文 } if (httpurlconnection != null) { httpurlconnection.disconnect(); }
學習Java的同學注意了?。。?/span>
學習進程中遇到甚么問題或想獲得學習資源的話,歡迎加入Java學習交換群,群號碼:183993990 我們1起學Java!