1. 程式人生 > >http協議+response+request+session+cookie

http協議+response+request+session+cookie

源自:http://www.cnblogs.com/zzuli/p/9518836.html
1.http協議
http協議也叫作超文字傳輸協議,定義了瀏覽器向怎樣向伺服器請求資源和伺服器怎樣將資源傳給瀏覽器。http協議是面向事務的應用層協議,是全球資訊網能夠傳遞資源的可靠保障。

目前http協議有1.0和1.1兩個版本。

http協議的組成可以分為兩部分,分別為http請求協議和http響應協議,http請求協議定義了瀏覽器向伺服器請求資源的方式和規則,由請求行、請求頭、請求體組成,http相應協議定義伺服器如何將資源傳回瀏覽器端的規定,包括響應頭、響應行、響應體。

http請求行主要包括三個資訊,http協議版本、請求資源的方式、請求的資源是什麼,其中http協議版本區別是

協議版本:

HTTP/1.0,傳送請求,建立一次連線,獲得一個web資源,連線斷開。

HTTP/1.1,傳送請求,建立一次連線,獲得多個web資源,保持連線。

請求頭代表著客戶端傳送給瀏覽器端的一些資訊,用鍵值對錶示,比如客戶端瀏覽器使用的語言,是否使用cookie技術,連線狀態是什麼等等。

常見請求頭

描述 (紅色掌握,其他了解)

Referer

瀏覽器通知伺服器,當前請求來自何處。如果是直接訪問,則不會有這個頭。常用於:防盜鏈

If-Modified-Since

瀏覽器通知伺服器,本地快取的最後變更時間。與另一個響應頭組合控制瀏覽器頁面的快取。

Cookie(手動標紅)

與會話有關技術,用於存放瀏覽器快取的cookie資訊。

User-Agent(手動標紅)

瀏覽器通知伺服器,客戶端瀏覽器與作業系統相關資訊

Connection

保持連線狀態。Keep-Alive 連線中,close 已關閉

Host

請求的伺服器主機名

Content-Length

請求體的長度

Content-Type

如果是POST請求,會有這個頭,預設值為application/x-www-form-urlencoded,表示請求體內容使用url編碼

Accept:

瀏覽器可支援的MIME型別。檔案型別的一種描述方式。

MIME格式:大型別/小型別[;引數]

例如:

text/html ,html檔案

text/css,css檔案

text/javascript,js檔案

image/*,所有圖片檔案

Accept-Encoding

瀏覽器通知伺服器,瀏覽器支援的資料壓縮格式。如:GZIP壓縮

Accept-Language

瀏覽器通知伺服器,瀏覽器支援的語言。各國語言(國際化i18n)

響應資訊:

Location

指定響應的路徑,需要與狀態碼302配合使用,完成跳轉。

Content-Type

響應正文的型別(MIME型別)

取值:text/html;charset=UTF-8

Content-Disposition

通過瀏覽器以下載方式解析正文

取值:attachment;filename=xx.zip

Set-Cookie

與會話相關技術。伺服器向瀏覽器寫入cookie

Content-Encoding

伺服器使用的壓縮格式

取值:gzip

Content-length

響應正文的長度

Refresh

定時重新整理,格式:秒數;url=路徑。url可省略,預設值為當前頁。

取值:3;url=www.itcast.cn //三秒重新整理頁面到www.itcast.cn

Server

指的是伺服器名稱,預設值:Apache-Coyote/1.1。可以通過conf/server.xml配置進行修改。<Connector port=“8080” … server=“itcast”/>

Last-Modified

伺服器通知瀏覽器,檔案的最後修改時間。與If-Modified-Since一起使用。

至於請求體,如果我們請求的方式是get,那麼我們請求資源時的引數就會出現在url後面,如果是post,引數就出現在請求體中。

http響應協議的響應行包括協議版本和狀態碼,不同的狀態碼代表不同的資訊。常見的狀態碼有404,500,200,304。

響應頭將伺服器端的資訊傳遞給瀏覽器,如上所示。

響應體:

響應體是伺服器回寫給客戶端的頁面正文,瀏覽器將正文載入到記憶體,然後解析渲染 顯示頁面內容

2.HttpServletResponse和HttpServletRequest物件
HttpServletRequest和HttpServletResponse分別代表資源請求和資源響應物件。HttpServletRequest物件代表客戶端的請求,當客戶端通過HTTP協議訪問伺服器時,HTTP請求頭中的所有資訊都會封裝在這個物件中,通過這個物件提供的方法,可以獲得客戶端的所有資訊。HttpServletResponse則可以獲得伺服器端的資訊。

Requset常用方法:

1.獲取客戶端資訊 getRequestUrl();

2.獲得客戶機請求頭getHeader();

3.獲得客戶端的引數getParameter(String name);

Request接收表單中文引數亂碼問題,之所以會產生亂碼,是因為瀏覽器的編碼方式和伺服器編碼方式不一樣導致的,因此解決方式是在瀏覽器和伺服器中設定一個統一的編碼,之後就按照統一的編碼進行傳輸,客戶端一般以UTF-8編碼將表單資料提交到伺服器,因此伺服器要設定以UTF-8編碼方式進行接收,方法為request.setCharacterEncoding(“UTF-8”)。

請求轉發:請求轉發是指一個web資源收到客戶端的請求後,通知伺服器去掉用另一個web資源進行處理。

轉發的方式有兩種:

1.通過ServletContext的getRequestDispatcher(String path)方法,該方法返回一個RequestDispatcher物件,這個物件呼叫forward方法實現請求轉發。

RequestDispatcher reqDispatcher=this.getServletContext().getRequestDispatcher("/test.jsp");

reqDispatcher.forward(request,reponse);
2.通過request物件提供的getRequestDispatcher(String path)方法,該方法返回一個RequestDispatcher物件,呼叫其forward方法。

request物件是一個域物件,可以通過Request物件在實現轉發時,把Request物件帶給其他web資源處理。但是隻能作用一次請求中。

轉發和重定向的區別:

轉發:一個web資源收到客戶端請求後,通知伺服器呼叫另外一個web資源進行處理,稱之為請求轉發307。

重定向:一個web資源收到客戶端請求後,通知瀏覽器呼叫另外一個web資源進行處理,稱之為請求重定向302。

HttpServletReponse物件reponse也有自己常用的方法,再次不在累贅,常見應用向客戶端輸出資料,可以實現檔案下載功能。

下載思路:

1.獲取下載路徑

2.獲取下載的檔名

3.設定響應頭控制瀏覽器以下載形式開啟檔案

4.獲得下載檔案流

5.建立緩衝區

6.通過response獲得OutputStream流

7.將輸入流寫到緩衝區

7.將緩衝區的內容輸出到客戶端

reponse物件能夠完成重定向

reponse.sendRedirect("");

3.cookie和session技術
兩者都是會話技術,cookie作用在客戶端,session作用在伺服器端。從開啟一個瀏覽器訪問某個站點,到關閉這個瀏覽器的整個過程,成為一次會話。會話技術就是記錄這次會話中客戶端的狀態與資料的。會話技術幫助區分客戶端。

cookie技術:伺服器端向瀏覽器端傳送一個cookie,首先建立一個cookie

Cookie cookie = new Cookie(String cookieName,String cookieValue);
向客戶端傳送cookie

response.addCookie(Cookie cookie);
這樣瀏覽器端就能有一個cookie資訊了。伺服器端怎樣接受cookie哪

1)通過request獲得所有的Cookie:

Cookie[] cookies = request.getCookies();

2)遍歷Cookie陣列,通過Cookie的名稱獲得我們想要的Cookie

for(Cookie cookie : cookies){

if(cookie.getName().equal(cookieName)){

String cookieValue = cookie.getValue();

}

}

session會話技術

Session技術是將資料儲存在伺服器端的技術,會為每個客戶端都建立一塊記憶體空間 儲存客戶的資料,但客戶端需要每次都攜帶一個標識ID去伺服器中尋找屬於自己的內 存空間。所以說Session的實現是基於Cookie,Session需要藉助於Cookie儲存客 戶的唯一性標識JSESSIONID

怎樣獲得屬於本客戶端的session物件(記憶體區域)?

HttpSession session = request.getSession();
物件會建立一個新的Session返回,如果已經有了屬於該會話的Session直接將已有 的Session返回(實質就是根據JSESSIONID判斷該客戶端是否在伺服器上已經存在 session了)

怎樣向session中存取資料(session也是一個域物件)?

session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);

session物件的生命週期?

建立:第一次執行request.getSession()時建立

銷燬:

1)伺服器(非正常)關閉時

2)session過期/失效(預設30分鐘)

問題:時間的起算點 從何時開始計算30分鐘?

從不操作伺服器端的資源開始計時

可以在工程的web.xml中進行配置

    <session-timeout>30</session-timeout>

3)手動銷燬session

session.invalidate();

預設在一次會話中,也就是說在,一次會話中任何資源公用一個session物件