1. 程式人生 > >Servlet(10)Http協議、HTTP請求和響應頭及其詳解(檔案下載)

Servlet(10)Http協議、HTTP請求和響應頭及其詳解(檔案下載)

1 HTTP協議

HTTP協議是網際網路上應用最廣泛的一種網路協議。是工作在TCP/IP協議基礎上的,所有的www檔案都必須遵守這個標準。設計HTTP的最初目的是為了提供一種釋出和接受HTML頁面的方法。
HTTP是TCP/IP協議的一個應用層協議,也是web開發的基礎。

2 HTTP請求

①客戶端連上伺服器後,向伺服器請求某個web資源,稱之為客戶端向伺服器傳送了一個HTTP請求。
一個完整的HTTP請求包括一下內容:一個請求行、若干個訊息頭、以及實體內容,其中的一些訊息頭和實體內容都是可選的,訊息頭和實體內容之間要用空行隔開。
這裡寫圖片描述
②get和post請求區別(見 Servlet(6)Servlet三種開發方式之繼承GenericServlet、HttpServlet及get和post提交表單方式的區別)

http://blog.csdn.net/u013943420/article/details/70051453
③http請求頭內容介紹
Referer:可以防盜鏈
// 獲取使用者瀏覽器的Referer

String referer = request.getHeader("Referer");
if(referer==null || !referer.startsWith("http://localhost:8080/ServletPro")) {
    response.sendRedirect("/ServletPro/Error");
    return;
}

3 HTTP響應

①一個HTTP響應代表伺服器向客戶端回送的資料,包括:一個狀態行、若干訊息頭、以及實體內容,其中訊息頭和實體內容是可選的,訊息頭和實體內容之間用空格隔開。
這裡寫圖片描述

這裡寫圖片描述
② 狀態行
格式: HTTP版本號 狀態碼 原因敘述
舉例:HTTP/1.1 200 OK
狀態碼用於表示伺服器對請求的處理結果,它是一個三位的十進位制數。響應狀態分為5類,如下所示
這裡寫圖片描述
③狀態碼演示案例

------ 302 ------
//response.setStatus(302);
//response.setHeader("Location", "/ServletPro/Servlet2");
// 與上面兩句話等價
response.sendRedirect("/ServletPro/Servlet2");
----- 404 找不到資源 ----
http://localhost:8080/ServletPro/Servlet1  (正確的格式)
http:
//localhost:8080/ServletPro/Servlet3 (url地址寫錯,重現404錯誤) ------ 500 伺服器錯誤 ----- int i = 300/ 0; out.println("hello world! Servlet1");

④響應頭 Refresh案例

// 延時跳轉、定時重新整理(url為自己的地址)
response.setHeader("Refresh", "5;url=http://www.baidu.com");

⑤響應頭 Content-Disposition(檔案下載)

response.setContentType("text/html; charset=utf-8");

// 檔案下載
response.setHeader("Content-Disposition", "attachment;filename=area.png");

// web站點下載檔案的原理
// 獲取檔案全路徑
String path = this.getServletContext().getRealPath("/images/area.png");
// 建立檔案輸入流
FileInputStream fis = new FileInputStream(path);
// 做一個快取
byte buff[] = new byte[1024];
int len = 0;
OutputStream os = response.getOutputStream();
while(( len=fis.read(buff) )>0 ) {
    os.write(buff, 0, len);
}
// 關閉
os.close();
fis.close();

System.out.println(path);

⑥響應頭 Expires、 Cache-Control、 Pragma 快取

// 瀏覽器預設會快取頁面
// 指定頁面不快取
response.setDateHeader("Expires", -1);
// 指定頁面快取時間為  一個小時
//response.setDateHeader("Expires", System.currentTimeMillis()+3600*1000);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");