面試和開發必會知識點:Cookie和Session

閱讀本文大約需要3分鐘,文章內容來自網絡和書籍總結,內容清晰詳盡,歡迎評論、收藏!

1.Cookie

1.1cookie 技術

  1. cookie技術是將用戶的數據存儲到瀏覽器客戶端的技術

  2. 服務器如何將cookie發送到客戶端

    Cookie cookie = new Cookie("lastTime", str_loginTime);
    cookie.setMaxAge(60 * 60 *24 *30); // one Month;Cookie在客戶端持久化的時間
    cookie.setPath(String path); //設置Cookie的攜帶路徑,訪問path路徑時,客戶端纔會攜帶上該cookie
    response.addCookie(cookie); //向客戶端發送cookie
    

    1.如果不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉,cookie信息銷燬(會話級別的cookie),如果設置持久化時間,cookie信息會被持久化到瀏覽器的磁盤文件裏

    2.cookie.setPath(String path);如果不設置攜帶路徑,那麼該cookie信息會在訪問產生該cookie的web資源所在的路徑都攜帶cookie信息

    3.如何刪除某cookie,使用同名同路徑的持久化時間爲0的cookie進行覆蓋即可

  3. 服務器如何接收客戶端攜帶的Cookie

    • cookie信息是以請求頭的方式發送到服務器端的:
    //1.通過request獲取所有的cookie
    Cookie[] cookies = request.getCookies();
    //2.遍歷Cookie數組
    for(Cookie c:cookies){
      
    }
    

1.2Cookie的工作流程/原理

​ 1.客戶端訪問服務器,服務器調用新建一個Cookie對象,response.addCookie(cookie)方法,

​ 2.產生響應時,會產生set-cookie響應頭,將cookie文本發送給客戶端,客戶端會將cookie文本保存起來,

​ 3.當客戶端再次請求服務器時,會產生cookie請求頭,將之前服務器發送的cookie信息,再發送給服務器,服務器就可以根據cookie信息跟蹤客戶端的狀態。

1.3Cookie的分類

  1. 會話級cookie:存放在客戶端瀏覽器的緩存中,當瀏覽器不關閉,cookie信息一直存在,瀏覽器一關閉,cookie消失
  2. 持久化cookie: 存放在客戶端的磁盤文件中,並可以設置cookie過期時間,過期時間之內,即使瀏覽器關閉,也可以將cookie信息發送給服務器,超過過期時間,cookie消失。

1.4Cookie的特點和作用

Cookie的特點:
	1. cookie存儲數據在客戶端瀏覽器
	2. 瀏覽器對於單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數量也有限制(20)
作用:
		1. cookie一般用於存出少量的不太敏感的數據
		2. 在不登錄的情況下,完成服務器對客戶端的身份識別
例子:記住上一次訪問時間
		1. 訪問一個Servlet,如果是第一次訪問,則提示:您好,歡迎您首次訪問。
		2. 如果不是第一次訪問,則提示:歡迎回來,您上次訪問時間爲:顯示時間字符串
    3. 注意cookie中存中文字段時,請先編碼,後解碼使用
      str_date = URLEncoder.encode(str_date,"utf-8");
      value = URLDecoder.decode(value,"utf-8");

2.Session

概念:服務器端會話技術,在一次會話的多次請求間共享數據,將數據保存在服務器端的對象中。HttpSession

  • 會爲每個客戶端都創建一塊內存空間 存儲客戶的數據,但客戶端需要每次都攜帶一個標識ID去服務器中尋找屬於自己的內 存空間。所以說Session的實現是基於Cookie,Session需要藉助於Cookie存儲客戶的唯一性標識JSESSIONID

2.1 獲取客戶端的Session對象

HttpSession session = req.getSession();   //1.獲取HttpSession對象
session.setAttribute("checkCode","1234"); //2.session對象的數據存取
Object checkCode = session.getAttribute("checkCode");
session.removeAttribute("checkCode");

2.2 Session對象的生命週期(面試)

創建:第一次執行request.getSession()時創建
銷燬:1)服務器(非正常)關閉時
     2)session過期/失效(默認30分鐘)-->距離上次點擊網站,間隔30分鐘
作用範圍: 默認在一次會話中,任何資源公用一個session對象

2.3瀏覽器關閉了,Session就銷燬了嗎?

當用戶關閉了瀏覽器雖然session cookie(JSESSIONID)已經消失,但session對象仍然保存在服務器端.

  • 是因爲大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器後這個session id就消失了,再次連接到服務器時也就無法找到原來的session。服務器會一直保留這個會話對象直到它處於非活動狀態超過設定的間隔爲止。

2.4Session的工作原理

  • 網頁間跳轉的額外數據,保存在服務器,用一個id標識,瀏覽器要維持session,需要每次提交都帶上這個id.

  • session 使用過期時間設爲0的cookie,並且將一個稱爲session ID的唯一標識符(一長串字符串),在服務器端同步生成一些 session文件(可以自己定義 session的保存類型),與用戶機關聯起來。

  • web應用程序存貯與這些 session 相關的數據,並且讓數據隨着用戶在頁面之間傳遞.訪問網站的來客會被分配一個唯一的標識符,即所謂的 SESSION ID。

2.5 Session是如何保存和調用的

  1. 保存:session是以文件的形式保存的,命名格式是:sess_[PHPSESSID的值]

  2. 調用:session.save_path路徑下記錄了不同瀏覽器,不同用戶的session文件,是依據用戶請求頭中cookie的JSESSIONID來確定的。

3.Cookie和Session的比較

3.1Cookie和Session的原理以及區別

  • 原理:
1.cookie採用的是客戶端的會話狀態的一種儲存機制。它是服務器在本地機器上存儲的小段文本或者是內存中的一段數據,並隨每一個請求發送至同一個服務器。

2. session是一種服務器端的信息管理機制,它把這些文件信息以文件的形式存放在服務器的硬盤空間上(這是默認情況,可以用memcache把這種數據放到內存裏面)當客戶端向服務器發出請求時,要求服務器端產生一個session時,服務器端會先檢查一下,客戶端的cookie裏面有沒有session_id,是否過期。如果有這樣的session_id的話,服務器端會根據cookie裏的session_id把服務器的session檢索出來。如果沒有這樣的session_id的話,服務器端會重新建立一個。JSESSIONID是一串加了密的字符串,它的生成按照一定的規則來執行。同一客戶端啓動二次session_start的話,session_id是不一樣的。
  • 區別:
①存在的位置:
cookie 存在於客戶端,臨時文件夾中;  session存在於服務器的內存中,一個session域對象爲一個用戶瀏覽器服務

②安全性
cookie是以明文的方式存放在客戶端的,安全性低,可以通過一個加密算法進行加密後存放;  session存放於服務器的內存中,所以安全性好

③網絡傳輸量
cookie會傳遞消息給服務器;  session本身存放於服務器,不會有傳送流量

④生命週期(20分鐘爲例)
cookie的生命週期是累計的,從創建時,就開始計時,20分鐘後,cookie生命週期結束;
session的生命週期是間隔的,從創建時,開始計時如在20分鐘,沒有訪問session,那麼session生命週期被銷燬。但是,如果在20分鐘內(如在第19分鐘時)訪問過session,那麼,將重新計算session的生命週期。關機會造成session生命週期的結束,但是對cookie沒有影響

⑤訪問範圍
cookie爲多個用戶瀏覽器共享;  session爲一個用戶瀏覽器獨享

3.2 如果用戶把cookie禁止掉,session也不能用了嗎?

  • 關鍵在於服務器獲取到JSessionId的方式:(1)請求頭中,通過cookie傳遞 (2)URL後提交 (3)表單形式提交
  • session產生的session_id放在cookie裏面,禁止掉cookie後,session還可以用,不過通過其他的方式來獲得這個sessionid,比如,可以跟在url的後面,或者以表單的形勢提交到服務器端。從而使服務器端了解客戶端的狀態。

3.3爲什麼說Session比Cookie更加安全

  • session的sessionID是放在cookie裏,要想功破session的話,得分兩步:

  • 第一:要得到sessionID。攻破cookie後,要得到sessionID, sessionID是要有人登錄,或者啓動session_start纔會有,但不知道什麼時候會有人登錄。

  • 第二:取有效sessionID。sessionID是加密的,第二次session_start的時候,前一次的sessionID就沒有用了,session過期時sessionid也會失效,想在短時間內功破加了密的 sessionID很難。session是針對某一次通信而言,會話結束session也就隨着消失了。
    (使session失效的方法:1.關閉tomcat 2.重啓web應用 3.session時間到 4.無效的session)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章