cookie,session傻傻分不清楚?

做了這麼多年測試,還是分不清什麼是cookie,什麼是session?很正常,很多初級開發工程師可能到現在都搞不清什麼是session,cookie相對來說會簡單很多。

下面這篇文章希望能夠幫助大家分清楚這兩個技術的區別和他們對應的使用場景。

一).cookie的特點:

  1. cookie是一門客戶端緩存技術
  2. cookie數據由服務器生成,發送給瀏覽器保存
  3. cookie數據的格式:鍵值對
  4. cookie數據過期機制:設置expire值

cookie是一門客戶端技術,一般是由服務器生成返回給瀏覽器客戶端來保存的,並且cookie是以鍵值對的形式保存在瀏覽器客戶端的,每一個cookie都會有名稱,值,過期時間...。cookie有很多使用場景,在項目中比較常見的有:

  1.登錄記住用戶名

  2.記錄用戶瀏覽記錄

  ...

上面應用中大家最熟悉的應該就是記住用戶名這個場景了,以京東網站的登錄功能爲例,當我們登錄了一次京東,後面再去登錄頁面登錄的時候,會發現它會幫你回填之前的用戶名,這個場景就是通過cookie技術實現的。

1.打開火狐瀏覽器,訪問京東登錄頁面輸入登錄賬號,密碼完成登錄:

 

 

2.首頁退出登錄:

 

 

3.登錄頁面再次登錄發現用戶名輸入框已經回填了之前的手機號:

 4.F12打開火狐瀏覽器找到保存手機號的這個cookie:“mp”,值就是我們填寫的用戶名信息:

總結:此實現過程:登錄成功,將手機號寫入到cookie---》回到登錄頁面再次登錄時,根據mp這個cookie的名稱取出手機號的值回填到用戶名輸入框(根據鍵取出值)

 

拓展:cookie是有過期機制的,可以通過設置cookie的過期時間來控制cookie什麼時候過期

這個mp的過期時間爲一個月,因此這一個月內只要不清除瀏覽器端的cookie數據,那麼使用火狐瀏覽器來訪問京東的登錄頁面都可以看到手機號回填的效果。

 

==============================================================分割線==========================================================================

二).session

session的特點:

  1. session是一門服務端會話緩存技術。
  2. session由服務器端的web容器創建,保存在服務器端。
  3. session保存數據:鍵值對形式
  4. session過期:默認30分鐘

session是服務端的會話技術,當用戶登錄了系統,服務器端的web容器就會創建一個會話,此會話中可以保存登錄用戶的信息,並且也是以鍵值對的形式去保存的,現在大部分系統都是使用的session技術來做的鑑權(權限鑑定),即:當用戶登錄完了纔可以訪問系統中的一些頁面和數據。

以下面的系統爲例:

直接訪問系統lmcanon的首頁index.html無法訪問成功,會被重定向到登錄頁面login.html,因爲這個系統有做用戶鑑權,沒有登錄的用戶無法訪問系統裏面的數據。

如下:

 

2.現在登錄系統:

打開F12可以看到,login登錄接口的響應頭裏有一個“set-cookie”的頭信息,裏面就有“JSESSIONID=8AC39619BB5BEC4426CF999A92E74337”這個信息,瀏覽器看到這個響應頭就知道要把這個數據寫到cookie當中,cookie名稱爲:“JSESSIONID”,值爲:“8AC39619BB5BEC4426CF999A92E74337”。這個session會話編號就是服務器返回的。服務器端的這個session會話保存了登錄用戶的信息。

作爲cookie緩存後,在瀏覽器的cookie中就能看到這個數據,如下圖:

 

 登錄完成後再訪問系統中的任何頁面都是有沒有問題的,因爲後面每次請求都會帶上瀏覽器裏cookie裏面的這個“JSESSIONID”的值過去,如下圖,訪問“一週排課” 這個菜單的時候,請求這個頁面以及頁面的任何一個接口請求都會在請求頭裏面帶上這個會話id“8AC39619BB5BEC4426CF999A92E74337” 然後再提交到服務器,如下圖的這個請求:

 

 

 

當服務器收到這個請求的“Cookie”請求頭裏的會話id去服務器匹配,判斷是同一個session會話,會話中有登錄用戶的信息,從而判斷這個請求是一個登錄用戶發出的,從而放行這個請求。

上面這個過程可以用下面的這張圖來表示:

 

 

 

拓展1:session過期處理。

當服務器端的會話過期了,那麼當你繼續發起請求的時候,因爲你從客戶端帶過去的會話編號還是之前的那個,就會驗證不通過,就會提示你會話過期請重新登錄。

拓展2:token機制

app項目爲例:
一般app項目都會基於一個token做鑑權。
因爲此時客戶端不是瀏覽器,因此就沒有cookie這一說了。
當用戶登錄app時,服務器會響應回來一個token信息(一般都是返回的一串唯一的標識符,比如說uuid或其他)。
服務器端會將登錄用戶跟token(票據)保存一個映射關係,一般保存在redis或者表裏面,服務器端響應回來的token會緩存在手機
的本地緩存裏,後面手機去訪問app的其他頁面,就會帶着這個token去服務器做驗證,如果通過這個token能夠從redis找到登錄用戶信息
那麼就認爲你是已經登錄了的用戶。

token失效:
一段時間後,服務器端的token失效了,那麼就會把此token跟用戶的映射關係從redis裏刪掉,那麼後面再來訪問的時候,根據你手機請求帶來的token
就匹配不上登錄用戶了,服務器就告訴客戶端,需要去做重新登錄了、

 

關於cookie,session,token的分享就到這裏,希望這些能夠幫到大家。有不正確的地方歡迎留言區指正。覺得不錯,別忘記點贊。

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