本文查閱方法:
一、查閱目錄 —— 查閱本文目錄,肯定想要查閱的目錄標題
二、快捷「查找」 —— 在當前瀏覽器頁面,按鍵 「Ctrl+F」 按鍵組合,開啓瀏覽器的查找功能,
在查找搜索框中 輸入須要查閱的 目錄標題,即可以直接到達 標題內容 的位置。
三、學習小結 —— 文中的學習小結內容,是筆者在學習以後總結出的,開發時可直接參考其進行應用
開發的內容, 進一步加快了本文的查閱 速度。(水平有限,僅供參考。)
html
本文目錄 web
學習小結apache
一、什麼是HTTP協議 瀏覽器
二、HTTP協議簡介緩存
三、HTTP1.0和HTTP1.1的區別tomcat
四、HTTP請求 概述服務器
五、HTTP請求的細節——請求行網絡
六、HTTP請求的細節——經常使用消息頭jsp
七、HTTP響應 概述工具
八、HTTP響應的細節——狀態行
九、HTTP響應細節——經常使用響應頭
十、Http請求經常使用響應頭信息範例Demo
十一、HTTP其餘實用頭字段及其Demo
學習小結
(1)HTTP請求:請求行經常使用兩種請求方式:
a. Get方式:數據在URL地址後以「?」的形式附帶,多個數據用「&」分隔,數據容量小於1k;
b. Post方式:數據在 實體 部分, 數據容量無限制。
(2)HTTP請求經常使用消息頭及Demo
Accept: text/html,image/*
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn
Host: www.it315.org:80
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT
Referer: http://www.it315.org/index.jsp
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie:
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
(3)HTTP響應:狀態行 經常使用狀態碼
200:請求響應正常;
302:要瀏覽器去找響應羣毆Location頭信息所標註的資源;
304/307:要瀏覽器去拿瀏覽器緩存數據;
404:找不到資源,建議檢查訪問路徑;
500:服務器處理訪問時,出現問題,沒法響應。
(4)HTTP響應經常使用消息頭及Demo
Location: http://www.sina .org/index.jsp
Server:apache tomcat
Content-Encoding: gzip
Content-Length: 80
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT
Refresh: 1;url=http://www.sina.org
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
ETag: W/"7777-1242234904000"
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
一、什麼是HTTP協議
HTTP協議用於定義客戶端與web服務器通迅的格式。客戶端連上web服務器後,若想得到web服務器中的某個web資源,需遵照必定的通信格式,HTTP協議就是用於定義通迅格式的協議。
【技巧:安裝IE瀏覽器插件HttpWatch,查看IE瀏覽器經過HTTP協議獲取某個頁面。可使用telnet程序連上web服務器,並使用HTTP協議獲取某個頁面,快速瞭解 HTTP協議的做用。】
二、HTTP協議簡介
HTTP是hypertext transfer protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用於定義WEB瀏覽器與WEB服務器之間交換數據的過程。
HTTP協議是學習JavaWEB開發的基石,不深刻了解HTTP協議,就不能說掌握了WEB開發,更沒法管理和維護一些複雜的WEB站點。
HTTP協議的版本:HTTP/1.0、HTTP/1.1
三、HTTP1.0和HTTP1.1的區別
在HTTP1.0協議中,客戶端與web服務器創建鏈接後,只能得到一個web資源。
在HTTP1.1協議中,容許客戶端與web服務器創建鏈接後,在一個鏈接上獲取多個web資源。
使用telnet舉例說明。
命令行:telnet localhost 8080
【小知識:Telnet默認不回顯數據,須要按鍵「Ctrl+]」,再按回車鍵,就會啓動數據回顯,就能夠看到輸入的字符】
問題:一個web頁面中,使用img標籤引用了三幅圖片,當客戶端訪問服務器中的這個web頁面時,客戶端總共會訪問幾回服務器,即向服務器發送了幾回HTTP請求。(4次)
【小知識:頁面優化技術原則之一:儘可能減小瀏覽器請求資源的次數】
四、HTTP請求 概述
客戶端連上服務器後,向服務器請求某個web資源,稱之爲客戶端向服務器發送了一個HTTP請求。一個完整的HTTP請求包括以下內容:
一個請求行、若干消息頭、以及實體內容,以下所示 :
五、HTTP請求的細節——請求行
請求行中的GET稱之爲請求方式,請求方式有七種:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT。而經常使用的有兩種: GET 方式、 POST 方式。用戶如沒有設置,默認狀況下瀏覽器向服務器發送的都是get請求,例如在瀏覽器直接輸地址訪問,點超連接訪問等都是get,用戶如想把請求方式改成post,可經過更改表單的提交方式實現。
無論POST或GET,都用於向服務器請求某個WEB資源,這兩種方式的區別主要表如今數據傳遞上:
a.如請求方式爲GET方式,則能夠在請求的URL地址後以?的形式帶上交給服務器的數據,
多個數據之間以&進行分隔,例如: GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特色:在URL地址後附帶的參數是有限制的,其數據容量一般不能超過1K。
b.如請求方式爲POST方式,則能夠在請求的實體內容中向服務器發送數據.
Post方式的特色:傳送的數據量無限制。
六、HTTP請求的細節——經常使用消息頭
用於HTTP請求中的經常使用頭:告訴服務器,瀏覽器的當前工做環境信息。
Demo樣例:
Accept: text/html,image/*
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn
Host: www.it315.org:80
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT
Referer: http://www.it315.org/index.jsp
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie:
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
請求頭詳解:
Accept: 用於告訴服務器,客戶機所支持的數據類型
Accept-Charset: 用於告訴服務器,客戶機所採用的碼錶
Accept-Encoding: 用於告訴服務器,客戶機所支持的數據壓縮格式
Accept-Language: 用於告訴服務器,客戶機的語言環境
Host: 用於告訴服務器,客戶機想訪問服務器哪臺主機
If-Modified-Since: 用於告訴服務器,客戶機對於資源的最後緩存時間,精確到秒級。
Referer: 用於告訴服務器,客戶機是從哪一個頁面去訪問服務器的 (防盜鏈)
User-Agent: 用於告訴服務器,客戶機的機器環境(例如所使用的操做系統,瀏覽器版本號)
Cookie:客戶端經過這個頭字段,能夠帶一些數據給服務器
Connection:客戶端經過這個頭字段告訴服務器,請求完成後,是保持連接仍是關閉連接
七、HTTP響應 概述
一個HTTP響應表明服務器向客戶端回送的數據,它包括:
一個狀態行、若干消息頭、以及實體內容 。
八、HTTP響應的細節——狀態行
狀態行
格式: HTTP版本號 狀態碼 緣由敘述<CRLF>
舉例:HTTP/1.1 200 OK
狀態碼用於表示服務器對請求的處理結果,它是一個三位的十進制數。響應狀態碼分爲5類,以下所示:
九、HTTP響應細節——經常使用響應頭
HTTP請求中的經常使用響應頭
Demo樣例:
Location: http://www.sina .org/index.jsp
Server:apache tomcat
Content-Encoding: gzip
Content-Length: 80
Content-Language: zh-cn
Content-Type: text/html; charset=GB2312
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT
Refresh: 1;url=http://www.sina.org
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
ETag: W/"7777-1242234904000"
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
響應頭詳解
Location:這個頭一般配合302狀態碼使用,服務器使用這個頭告訴瀏覽器去找誰【範例見Demo1】
Server:服務器經過這個頭告訴瀏覽器,服務器的類型
Content-Encoding: 服務器經過這個頭告訴瀏覽器,數據的壓縮格式(gzip) 【範例見Demo2】
必定要壓縮服務器返回數據,既可提高服務器性能,又可大大減小服務器網絡流量費用
Content-Length:服務器經過這個頭告訴瀏覽器,回送數據的長度【範例見Demo2】
Content-Language: 服務器經過這個頭告訴瀏覽器,回送數據的語言;
Content-Type: 服務器經過這個頭告訴瀏覽器,回送數據的類型【範例見Demo3】
對於響應返回圖片、視頻、音頻等數據類型時,很重要。
Last-Modified: 服務器經過這個頭告訴瀏覽器,數據的最後修改時間,精確到秒級。
Refresh:服務器 告訴瀏覽器,多長時間定時刷新或定時轉向其餘頁面 (論壇刷新)【範例見Demo4】
Content-Disposition: 控制瀏覽器如下載方式打開回送的數據【範例見Demo5】
對於響應返回圖片、視頻、音頻等數據類型時,可能會用到。
Transfer-Encoding: 服務器經過這個頭告訴瀏覽器,數據是以塊方式回送的(用的少)
Expires:控制瀏覽器緩存數據的時間(-1或0,表明控制瀏覽器不要緩存)
時間+數據:保存該數據緩存的時間,eg:2012 12 12 (1.html)
Cache-Control: no-cache
Pragma: no-cache
以上三個頭一塊兒用,就能夠控制全部的瀏覽器不要緩存數據
ETag:緩存相關,服務器給每個網頁都生成一個編碼,用來進行比對,以配合304或307通知瀏覽器是否使用緩存的數據,精確到毫秒級。(通常的服務器不須要這麼嚴謹)
十、Http請求經常使用響應頭信息範例Demo
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test5(response);
}
【範例Demo1:Location 】
//指示瀏覽器從新定向
public void test1(HttpServletResponse response){
response.setStatus(302);
response.setHeader("location", "/day04/index.jsp");
}
【範例Demo2:Content-Encoding 】
// 演示數據壓縮
public void test2(HttpServletResponse response) throws IOException{
String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; //數據過小可能會壓縮後反而更大,當數據大時壓縮效果才顯著。
System.out.println("原始數據的大小:" + data.getBytes().length);
//下面代碼是壓縮數據。GZIPOutputStream 是JDK自帶的gzip壓縮工具類,須要將數據寫入流中
ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(bout);
gout.write(data.getBytes());
gout.close();
byte gzipData[] = bout.toByteArray(); //得到gzip壓縮後的數據
response.setHeader("Content-Encoding", "gzip"); //告訴瀏覽器壓縮數據的格式
response.setHeader("content-length", gzipData.length+""); //數據大小
response.getOutputStream().write(gzipData); //返回瀏覽器
}
【範例Demo3:Content-Type 】
//content-type頭字段的做用
public void test3(HttpServletResponse response) throws IOException{
String path = this.getServletContext().getRealPath("/02.jpg");
FileInputStream in = new FileInputStream(path);
byte buffer[] = new byte[1024];
int len = 0;
response.setHeader("content-type", "image/jpeg");//此語句要在寫數據前執行
OutputStream out = response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
out.close();
in.close();
}
【範例Demo4:Refresh 】
//控制瀏覽器定時刷新
public void test4(HttpServletResponse response) throws IOException{
response.setHeader("refresh", "3;url='http://www.sina.com'");
response.getWriter().write("你的頁面 3 秒鐘後將會轉向新浪首頁");
}
【範例Demo5:Content-Disposition 】
//控制瀏覽器下載
public void test5(HttpServletResponse response) throws IOException{
response.setHeader("content-disposition", "attachment;filename=02.jpg");
String path = this.getServletContext().getRealPath("/01.jpg");
FileInputStream in = new FileInputStream(path);
byte buffer[] = new byte[1024];
int len = 0;
OutputStream out = response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
out.close();
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
十一、HTTP其餘實用頭字段 及其Demo
HTTP請求頭字段
Range頭指示服務器只傳輸一部分Web資源。這個頭能夠用來實現斷點續傳功能。
Range字段能夠經過三種格式設置要傳輸的字節範圍:
Range: bytes=1000-2000 : 傳輸範圍從1000到2000字節。
Range: bytes=1000- : 傳輸Web資源中第1000個字節之後的全部內容。
Range bytes=1000 : 傳輸最後1000個字節。
因爲瀏覽器並不支持該頭字段,因此須要本身寫客戶端程序來實現該字段的功能。
HTTP響應消息頭字段
Accept-Ranges:這個字段說明Web服務器是否支持Range,
支持則返回Accept-Ranges: bytes,
若是不支持,則返回Accept-Ranges: none.
Content-Range:指定了返回的Web資源的字節範圍。這個字段值的格式是:
例子: Content-Range:1000-3000/5000
Demo樣例:
public class DownLoad {
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:8080/day04/1.txt");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Range", "bytes=6-");
FileOutputStream out = new FileOutputStream("c:\\1.txt",true);
InputStream in = conn.getInputStream();
int len = 0;
byte buffer[] = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}