做了這么多年測試,還是分不清什么是cookie,什么是session?很正常,很多初級開發工程師可能到現在都搞不清什么是session,cookie相對來說會簡單很多。
下面這篇文章希望能夠幫助大家分清楚這兩個技術的區別和他們對應的使用場景。
一).cookie的特點:
- cookie是一門客戶端緩存技術
- cookie數據由服務器生成,發送給瀏覽器保存
- cookie數據的格式:鍵值對
- 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的特點:
- session是一門服務端會話緩存技術。
- session由服務器端的web容器創建,保存在服務器端。
- session保存數據:鍵值對形式
- 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的分享就到這里,希望這些能夠幫到大家。有不正確的地方歡迎留言區指正。覺得不錯,別忘記點贊。