1. 程式人生 > 實用技巧 >JavaWeb請求與響應 Cookie&Session

JavaWeb請求與響應 Cookie&Session

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: 追求一個資源請求中間所經過的代理(該方法不能由瀏覽器發出)
請求資料組成(請求報文):請求行、請求頭請求體 參考https://www.cnblogs.com/lmh001/p/9928517.html

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

響應行: ①報文協議及版本; ②狀態碼及狀態描述; 響應頭: ③響應報文頭,也是由多個屬性組成; 響應體: ④響應報文體,即我們真正要的“乾貨” 響應狀態碼 和請求報文相比,響應報文多了一個“響應狀態碼”,它以“清晰明確”的語言告訴客戶端本次請求的處理結果。

HTTP的響應狀態碼由5段組成:
  • 1xx 訊息,一般是告訴客戶端,請求已經收到了,正在處理,別急...
  • 2xx 處理成功,一般表示:請求收悉、我明白你要的、請求已受理、已經處理完成等資訊.
  • 3xx 重定向到其它地方。它讓客戶端再發起一個請求以完成整個處理。
  • 4xx 處理髮生錯誤,責任在客戶端,如客戶端的請求一個不存在的資源,客戶端未被授權,禁止訪問等。
  • 5xx 處理髮生錯誤,責任在服務端,如服務端丟擲異常,路由出錯,HTTP版本不支援等。

參考一次完整的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個方面決定:
  1. 瀏覽器關閉,會話結束,導致已有的session沒用了,但是依然駐留在記憶體中.
  2. session在伺服器記憶體中不是永久的,距離上一次請求超過30分鐘會被銷燬。(過期時可以通過xml檔案配置來修改)
//關閉瀏覽器產生新的sessionid原因:就是伺服器自動寫入的cookie採用預設有效期 //如果要想關閉瀏覽器依然訪問已有session,必須修改cookie的有效期 Session使用總結: session資料存在伺服器,伺服器個每個客戶端建立單獨的儲存空間,是批量的操作。所以session不能儲存大量的資料,否則伺服器開會記憶體溢位。 以後只儲存如下2個應用場景: 1.驗證碼 2.登入的使用者資料。
大總結: 如果想要相應速度快,可以使用session,因為session是伺服器記憶體的,速度快。如果想要減輕伺服器壓力,就使用cookie。如果想存入大量資料並且永久儲存,就使用資料(資料庫操作的是磁碟,速度較慢)