首頁 > Java > java教程 > 主體

Java與Http協定的詳解

黄舟
發布: 2017-09-08 09:45:45
原創
1749 人瀏覽過

這篇文章主要介紹了Java與Http協議的詳細介紹的相關資料,這裡提供實例來幫助大家學習理解這部分內容,需要的朋友可以參考下

Java與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();
}
登入後複製

以上是Java與Http協定的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板