1、請求與響應 &Cookie&Session
1.1、請求與響應
HTTP協議
概念:英文全稱:HyperText Transfer Protocol 中文全稱:超文本傳輸協議

瀏覽器與服務器底層通信是基於tcp/ip協議socket方式進行通信的。tcp/ip協議只是解決通信傳輸數據的問題,並沒有解決傳遞數據的是否瀏覽器與服務器都認識。Http協議規定了傳輸數據的格式,達到瀏覽器與服務器都可以識別到
http協議特點:
http協議是無狀態,http協議不會記錄任何數據,請求響應完成后所有數據丟失。
(1)HTTP是無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
(2)HTTP是媒體獨立的:只要客戶端和服務器知道如何處理的數據內容,任何類型的數據都可以通過HTTP發送。客戶端以及服務器指定使用適合的MIME-type內容類型。
(3)HTTP是無狀態:無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
GET: 完整請求一個資源 (常用)
HEAD: 僅請求響應首部
POST:提交表單 (常用)
PUT: (webdav) 上傳文件(但是瀏覽器不支持該方法)
DELETE:(webdav) 刪除
OPTIONS:返回請求的資源所支持的方法的方法
TRACE: 追求一個資源請求中間所經過的代理(該方法不能由瀏覽器發出)
請求數據組成(請求報文):請求行、請求頭請求體


請求行:
①是請求方法,GET和POST是最常見的HTTP方法,除此以外還包括DELETE、HEAD、OPTIONS、PUT、TRACE。
②為請求對應的URL地址,它和報文頭的Host屬性組成完整的請求URL。
③是協議名稱及版本號。
請求頭:
④是HTTP的報文頭,報文頭包含若干個屬性,格式為“屬性名:屬性值”,服務端據此獲取客戶端的信息。
與緩存相關的規則信息,均包含在header中
請求體:
⑤是報文體,它將一個頁面表單中的組件值通過param1=value1¶m2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求參數的數據。不但報文體可以傳遞請求參數,請求URL也可以通過類似於“/chapter15/user.html? param1=value1¶m2=value2”的方式傳遞請求參數。
HTTP的響應報文也由三部分組成(響應行+響應頭+響應體)

響應行:
①報文協議及版本;
②狀態碼及狀態描述;
響應頭:
③響應報文頭,也是由多個屬性組成;
響應體:
④響應報文體,即我們真正要的“干貨”
響應狀態碼
和請求報文相比,響應報文多了一個“響應狀態碼”,它以“清晰明確”的語言告訴客戶端本次請求的處理結果。
HTTP的響應狀態碼由5段組成:
- 1xx 消息,一般是告訴客戶端,請求已經收到了,正在處理,別急...
- 2xx 處理成功,一般表示:請求收悉、我明白你要的、請求已受理、已經處理完成等信息.
- 3xx 重定向到其它地方。它讓客戶端再發起一個請求以完成整個處理。
- 4xx 處理發生錯誤,責任在客戶端,如客戶端的請求一個不存在的資源,客戶端未被授權,禁止訪問等。
- 5xx 處理發生錯誤,責任在服務端,如服務端拋出異常,路由出錯,HTTP版本不支持等。
重定向和請求轉發的區別
1、重定向是兩次請求,轉發是一次請求,因此轉發的速度要快於重定向2、重定向之后地址欄上的地址會發生變化,變化成第二次請求的地址,轉發之后地址欄上的地址不會變化,還是第一次請求的地址3、轉發是服務器行為,重定向是客戶端行為。重定向時瀏覽器上的網址改變 ,轉發是瀏覽器上的網址不變4、重定向是兩次request,轉發只有一次請求5、重定向可以跨域訪問,而轉發是在web服務器內部進行的,不能跨域訪問
1、2 Cookie&Session
web會話從瀏覽器第一次請求服務器開始到瀏覽器關閉結束,之間發生的多次請求與響應過程就叫會話過程。
會話的數據,http協議不會進行保存,http協議是無狀態。會話的數據需要保存,保存在哪里?
答:會話數據可以保存到客戶端、服務器端,專門有會話對象進行保存。
客戶端會話對象是cookie,服務器端會話對象是session
會話專屬於唯一的客戶端與服務器端,不同的瀏覽器會話數據不一樣。
小結:cookie存儲的數據存放在客戶端,可減少服務器壓力
應用場景:記住用戶名、自動登錄,過程分析、
操作cookie存取數據,
cookie特點:是服務器寫入cookie,客戶端存儲數據,瀏覽器每次訪問服務器器都會攜帶cookie的數據到服務器
cookie的相關api方法
寫入cookie的api方法 Cookie cookie = new Cookie(string,string); //創建cookie寫入一個鍵值對數據 cookie.setMaxAge(秒數);//設置cookie的有效期 response.addCookie(cookie);//將cookie數據輸出給瀏覽器去保存 讀取cookie的api方法,服務器讀取cookie數據 Cookie[] cookies = request.getCookies(); cookie.getName(),獲取cooke的key cookie.getValue(),獲取cookie的value
注意:1、cookie只能存儲String類型的數據。2、每個key存儲數據不能超過4KB,每個瀏覽器支持的都不一樣。3、cookie存儲的數據默認過期時間是,會話結束,瀏覽器關閉。4、cookie的數據從瀏覽器到服務器的,瀏覽器會每次訪問資源都會默認攜帶所有cookie數據,但可以通過修改有效路徑改變。5、cookie沒有專門刪除的方法,必須采用覆蓋方式刪除客戶端的cookie。服務器需要創建一個一模一樣的cookie(存儲的key,path有效路徑),設置有效期為0,立刻失效,設置value為空字符串。
客戶端會話cookie使用總結
1、3 作用域
服務器為每個瀏覽器創建單獨的存儲空間對象(服務器內存),就是session對象,session有有效期(有效期默認有30分鍾)。
session是會話域對象,作用域有三個:
請求域request,會話域session,上下文域servletContext。

瀏覽器關閉會話就會過期,但是很神奇服務器怎么知道瀏覽器關閉了呢,就產生新的session對象?
答:因為瀏覽器提交請求中會攜帶cookie,服務器根據客戶端cookie判斷是否有Jsessionid,有的話在內存中查到已有的session對象返回使用
否則創建新的session對象,並寫入cookie。session技術是依賴於cookie技術的。
默認有效期
session有2個方面決定:
- 瀏覽器關閉,會話結束,導致已有的session沒用了,但是依然駐留在內存中.
- session在服務器內存中不是永久的,距離上一次請求超過30分鍾會被銷毀。(過期時可以通過xml文件配置來修改)
關閉瀏覽器產生新的sessionid原因:就是服務器自動寫入的cookie采用默認有效期
如果要想關閉瀏覽器依然訪問已有session,必須修改cookie的有效期
Session使用總結:
session數據存在服務器,服務器個每個客戶端創建單獨的存儲空間,是批量的操作。所以session不能存儲大量的數據,否則服務器開會內存溢出。
以后只存儲如下2個應用場景:
1.驗證碼
2.登錄的用戶數據。
總結:如果想要相應速度快,可以使用session,因為session是服務器內存的,速度快。如果想要減輕服務器壓力,就使用cookie。如果想存入大量數據並且永久保存,就使用數據(數據庫操作的是磁盤,速度較慢)