Java與Http協議

Java與Http協議

引言                                        

      http(超文本傳輸協議)是一個基於請求與響應模式的、無狀態的、應用層的協議,常基於TCP的連接方式。HTTP協議的主要特點是:
     1.支持客戶/服務器模式。
     2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。由於HTTP協議簡單,通信速度很快。
     3.靈活:HTTP允許傳輸任意類型的數據對象。類型由Content-Type加以標記。
     4.無連接:即每次連接只處理一個請求,處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
     5.無狀態:無狀態是指協議對於事務處理沒有記憶能力。 

     http1.0協議默認的是非持久連接, HTTP1.1默認的連接方式爲持久連接。

非持久連接:每次服務器發出一個對象後,相應的TCP連接就被關閉,也就是說每個連接都沒有持續到可用於傳送其他對象。每個TCP連接只用於傳輸一個請求消息和一個響應消息。

持久連接:服務器在發出響應後讓TCP連接繼續打開着。同一對客戶/服務器之間的後續請求和響應可以通過這個連接發送。HTTP/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請求的三部:請求行、消息報頭、請求正文。

 

     請求行以一個方法符號開頭,以空格分開,後面跟着請求的URI和協議的版本,格式如下:

Method Request-URI HTTP-Version CRLF  
     其中 Method表示請求方法(如POST、GET、PUT、DELETE等);Request-URI是一個統一資源標識符;HTTP-Version表示請求的HTTP協議版本;CRLF表示回車和換行。

 

二、HTTP協議詳解之響應篇

複製代碼
//狀態行
HTTP/1.1 200 OK (CRLF)

//消息報頭
Cache-Control: private, max-age=30
Content-Type: text/html; charset=utf-8
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響應也是由三個部分組成,分別是:狀態行、消息報頭、響應正文

     狀態行格式如下:
          HTTP-Version Status-Code Reason-Phrase CRLF
     其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。

常見狀態代碼、狀態描述、說明:
200 OK      //客戶端請求成功
400 Bad Request  //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用 
403 Forbidden  //服務器收到請求,但是拒絕提供服務
404 Not Found  //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable  //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

 

三、HTTP協議詳解之消息報頭

        HTTP消息由客戶端到服務器的請求和服務器到客戶端的響應組成。請求消息和響應消息都是由開始行(對於請求消息,開始行就是請求行;對於響應消息,開始行就是狀態行),消息報頭(可選),空行(只有CRLF的行),消息正文(可選)組成。

        HTTP消息報頭包括普通報頭、請求報頭、響應報頭、實體報頭。每一個報頭域都是由名字+“:”+空格+值 組成,消息報頭域的名字是大小寫無關的。

1、請求報頭
     請求報頭允許客戶端向服務器端傳遞請求的附加信息以及客戶端自身的信息。


常用的請求報頭

Accept請求報頭域用於指定客戶端接受哪些類型的信息。
Accept-Charset請求報頭域用於指定客戶端接受的字符集。
Accept-Encoding請求報頭域類似於Accept,但是它是用於指定可接受的內容編碼。
Accept-Language請求報頭域類似於Accept,但是它是用於指定一種自然語言。
Authorization請求報頭域主要用於證明客戶端有權查看某個資源。

Host請求報頭域主要用於指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的。User-Agent請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器。

2、響應報頭

     響應報頭允許服務器傳遞不能放在狀態行中的附加響應信息,以及關於服務器的信息和對Request-URI所標識的資源進行下一步訪問的信息。


常用的響應報頭
Location響應報頭域用於重定向接受者到一個新的位置。Location響應報頭域常用在更換域名的時候。
Server響應報頭域包含了服務器用來處理請求的軟件信息

3. 實體報頭

請求和響應消息都可以傳送一個實體。


常用的實體報頭
Content-Encoding指示已經被應用到實體正文的附加內容的編碼。

Content-Language實體報頭域描述了資源所用的自然語言。

Content-Length實體報頭域用於指明實體正文的長度,以字節方式存儲的十進制數字來表示。
Content-Type實體報頭域用語指明發送給接收者的實體正文的媒體類型。
Last-Modified實體報頭域用於指示資源的最後修改日期和時間。
Expires實體報頭域給出響應過期的日期和時間。

 

四、補充

1、HTTP協議Content Lenth限制漏洞導致拒絕服務攻擊
使用POST方法時,可以設置ContentLenth來定義需要傳送的數據長度,例如ContentLenth:999999999,在傳送完成前,內 存不會釋放,攻擊者可以利用這個缺陷,連續向WEB服務器發送垃圾數據直至WEB服務器內存耗盡。這種攻擊方法基本不會留下痕跡。
2、爲了提高用戶使用瀏覽器時的性能,現代瀏覽器還支持併發的訪問方式,瀏覽一個網頁時同時建立多個連接,以迅速獲得一個網頁上的多個圖標,這樣能更快速完成整個網頁的傳輸。HTTP1.1中提供了這種持續連接的方式,而下一代HTTP協議:HTTP-NG更增加了有關會話控制、豐富的內容協商等方式的支持,來提供更高效率的連接。

 

五.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();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章