Java開發工程師(Web方向) - 02.Servlet技術 - 第2章.Cookie與Session

第2章--Cookie與Session

Cookie與Session

瀏覽器輸入地址--HTTP請求--Servlet--HTTP響應--瀏覽器接收瀏覽器

會話(session):打開瀏覽器,打開一系列頁面,關閉瀏覽器安全

使用場景:服務器

網購網站的偏好記錄cookie

網站的自動登陸session

瀏覽記錄,如歡迎標語「xxx再次回來」併發

原理:客戶端/服務器端保存會話數據:Cookie(瀏覽器端)/Session(服務器端)post

Cookie:測試

爲了辨別用於身份而儲存在用戶終端的key-value數據網站

工做流程:ui

瀏覽器發出HTTP請求

服務器根據須要生成Cookie對象並把相關數據保存在該對象中

將Cookie對象放在HTTP響應頭中一併發送給瀏覽器

瀏覽器接收到響應後,提出該Cookie並保存;

瀏覽器第二次訪問該服務器時

將Cookie放在請求頭中一併發送給服務器

服務器從請求頭中提取該Cookie對象讀取數據作出個性化的響應

Cookie的生命週期:

默認爲 會話結束後失效 -- 稱爲會話Cookie,通常保存在內存中

setMaxAge設置有效期,保存在硬盤中

Cookie的缺陷:

大小和數量的限制:通常爲每一個站點保存最多20個Cookie,每一個Cookie在4k之內

數據安全性問題:HTTP請求中的Cookie是明文傳遞的

Cookie:

case:登錄

登錄頁面 form post獲取userName和userPassword到user/specify

在user/specify的Servlet中:process() 中

String userName=request.getParameter("userName"); 

String userPassword=request.getParameter("userPassword");

// 建立Cookie
Cookie userNameCookie = new Cookie("userName", userName);
Cookie passwordCookie = new Cookie("password", userPassword);
// 將Cookie放入對應的響應體中
response.addCookie(userNameCookie);
response.addCookie(passwordCookie);
// 設置過時時間
userNameCookie.setMaxAge(2 * 60); // unit minute
passwordCookie.setMaxAge(2 * 60);

第二次登錄時讀取cookie:

Cookie[] cookies = request.getCookies();
if(cookies != null) {
    for(Cookie cookie: cookies) {
        if(cookie.getName().equals("userName")) {
            userName = cookie.getValue();
        }
        if(cookie.getName().equals("userPassword") {
            userPassword = cookie.getValue();
        }
    }
}

 

第二次登錄頁面時,打開developer tools--Application--cookies可見詳情

 

Session:

HTTPSession服務器端爲客戶端建立的對象,用於保存客戶端的狀態數據

工做原理:

瀏覽器端發送HTTP請求到服務器端

服務器端根據請求需求生成一個Session對象,並給該對象附上惟一編號和對應數據

服務器端將Session對象的惟一編號放到Cookie對象中

服務器將HTTP響應返回給瀏覽器端

瀏覽器再次發送請求到該服務器時

服務器收到帶有Seesion id的Cookie以後,取出Session id,找到對應Session對象

辨別出對應用戶後,對用戶進行個性化的響應

Session生命週期

默認有效期30分鐘

setMaxInactiveInterval設置有效期(單位:秒)

部署描述符配置有效期(單位:分鐘)

<session-config>
    <session-timeout>2</session-timeout>
</session-config>

invalidate使Session失效

--優先級:接口 > 部署描述符

case:登錄(在上例Cookie的基礎上)

// 建立HTTPSession對象
HttpSession session = request.getSession();    // 無Session時默認建立新的Session對象
String name = (String) session.getAttribute("userName");
session.setMaxInactiveInterval(2 * 60);  // expire time (seconds)
session.invalidate();  // invalidate the session

// 再次請求時
if (name != null) {
syso("second login: " + name);
}

// 將數據放入Session對象
session.setAttribute("userName", userName);

 

在Chrome--developer tools--Application--Cookies--能夠看到JSESSIONID

 

總結:

數據存儲:Cookie存在於客戶端;Session存在於服務器端

安全性:Cookie在客戶端明文傳遞;Session存在於服務器端的內存中,安全性較強

生命週期:到時間失效;Cookie時間設置爲第一次訪問開始算起;Session時間設置爲從最後一次訪問開始算起,Session可主動讓其失效

使用原則:Cookie有數量(20)、大小(4k)限制;Session存在於內存,建議大小不要太大

 

單元測驗: Cookie與Session

本次得分爲: 20.00/20.00, 本次測試的提交時間爲: 2017-08-07, 若是你認爲本次測試成績不理想,你能夠選擇 再作一次。
1 單選(2分)

下面哪一種場景沒有使用會話技術?

  • A.第二次登陸某網站時,頁面會顯示「歡迎再次回來」的提示
  • B.打開某網站,隨機彈出廣告2.00/2.00
  • C.登陸購物網站後,首頁會推薦一些以前你瀏覽過的商品
  • D.第一次登陸某網站輸入用戶名密碼後,第二次無需再次輸入用戶名密碼
2 單選(2分)

下面哪項關於Cookie與Session的生命週期說法是錯誤的?

  • A.Session能夠主動讓其失效,Cookie則不行
  • B.Session默認狀況下,有效期是30分鐘
  • C.Cookie默認狀況下,會話結束後失效
  • D.Session經過部署描述符設置的有效期優先級高於經過API設置的有效期2.00/2.00
3 單選(2分)

下面哪項說法是錯誤的?

  • A.瀏覽器對每一個站點可以存放的Cookie數量是沒有限制的2.00/2.00
  • B.Session的生命週期是間隔的,即從最後一次訪問開始計時
  • C.Cookie的生命週期是累積的,到點即失效
  • D.瀏覽器對每一個站點可以存放的Cookie的大小是有限制的
4 單選(2分)

下面哪項對Session的說法是錯誤的?

  • A.Session由於保存在服務端,因此能夠任意使用2.00/2.00
  • B.每個Session對象都有一個惟一的Session Id
  • C.程序開發人員能夠經過API調用主動讓Session失效
  • D.Web應用程序關閉,Session會失效
5 單選(2分)

下面哪項說法是正確的?

  • A.Cookie有Cookie Id做爲惟一標識,區分不一樣Cookie
  • B.Session跟Cookie是獨立存在的,沒有相互依賴的關係
  • C.每一個站點只能訪問存放在本身站點下的Cookie2.00/2.00
  • D.Cookie是在客戶端產生的
6 判斷(2分)

Cookie是保存在客戶端,Session是保存在服務端

  • A.√2.00/2.00
  • B.×
7 判斷(2分)
Cookie和Session都是保存的key,value的鍵值對數據
  • A.√2.00/2.00
  • B.×
8 判斷(2分)

相對而言,Cookie比Session安全性更高

  • A.√
  • B.×2.00/2.00
9 判斷(2分)

Cookie是一直會保存在客戶端瀏覽器中

  • A.×2.00/2.00
  • B.√
10 判斷(2分)

Session有默認的有效期,有效期過了Session數據會失效

  • A.√2.00/2.00
  • B.×
相關文章
相關標籤/搜索