客戶端快取機制 - Cookie詳解
Cookie
作者:Stanley 羅昊
Cookie不是內建物件 ,所以用的時候需要 new出來 , Cookie是由服務端產生的 , 再發送給客戶端儲存,它不是內建物件,卻是由服務端產生的,產生完後給了客戶端;
它存在於客戶端,卻不是客戶端產生的,是服務端產生的,產生完後給你了
Cookie的作用
Cookie就是我們所理解的快取,本地快取;
比如客戶端訪問服務端,第一次訪問結束後,我就會產生一個Cookie,把這個Cookie保留到客戶端, 打個比方:我第一次開啟一個網頁去看一個視訊,它就需要網路或上網流量請求伺服器獲取資源,看完後服務端就會將你看的這個視訊放到一個Cookie裡面,然後傳送給客戶端,我下次再去看這個視訊的時候,我就無需連線網路直接在本地即可觀看,所以這就叫服務端產生(請求資源需要請求對應視訊的伺服器),傳送給客戶端(請求完畢後【就是看完後】,將資源儲存到本地);有點兒像一邊看一邊下載。
但是它有缺點 ,它除了能放視訊它還能放電影、音樂、文章甚至我們的密碼也能放, 使用者名稱資訊也能放,所以放一些使用者資訊就比較危險了 ,比方說我第一次訪問網站,我登入了,我的名字叫張三,密碼abc,服務端將我的資訊放到Cookie裡面再發送給客戶端,那我以後確實不需要登入了,我就可以直接在本地讀取賬號密碼登入,這樣就不安全了,萬一別人用你電腦解析破解了。
所以Cookie能提高訪問服務端的效率,但是安全性較差!
Cookie內部細節
Cookie內部包含一個key = value ,有點像JSON跟MAP,既然它不是內建物件,那是誰提供的呢?
是一個擴充套件類:java.servlet.http.Cookie 物件就是由這個類產生的,類產生物件,這些類跟這些物件的方法:
首先有一個構造方法, public Cookie(String key String value),通過構造方法,你可以寫k你也可以寫v;
String getName(),這個方法用來獲取構造方法裡面的key
String getValue(),這個就用來獲取裡面的值 Value
還有一個Void setMaxAge(int expiry),這個方法是設定最大有效期(單位是 秒)該方法說明:
我現在服務端把一個檔案生成一個Cookie發給客戶端了,但是它有時間限制,比如規定,30分鐘內有效,超過就失效
準備Cookie 增加Cookie 傳送Cookie 獲取Cookie
1.在服務端準備Cookie
因為是構造方法,直接賦值即可,這裡我們就模擬使用者名稱=zs
密碼=abc
2.增加Cookie
服務端傳送給客戶端需要一個內建物件:response.addCookie(Cookie cookie),把物件放進去即可,比如使用者的資訊做登入儲存賬號密碼的時候用
3.傳送Cookie
直接將頁面跳轉( 轉發 重定向都可以 ),比如說我現在服務端有一個Cookie了,我現在不管用轉發還是重定向到第二個頁面了,那我第二個頁面就需要獲取該Cookie
Cookie最終要到客戶端去,所以我們開始傳送Cookie到客戶端( 轉發 重定向都可以,總之你跳轉過去就行了 ):
我這裡讓它跳到了 result.jsp 頁面了
4.獲取Cookie
使用request.getCookie();
因為我們不能獲取單個,所以返回必定是陣列 ,獲取後我們需要迴圈 遍歷 出來, 這裡就假設result.jsp是客戶端 ,因為客戶端需要獲取Cookie:
因為有key value對 ,所以我們獲取時候也需要全部獲取並且打印出來, 獲取key就cookie.getName(),獲取value也就是值 cookie.getValue()即可;
值得注意的是, 要獲取Cookies不能獲取某一個Cookie,只能獲取全部Cookie,因為現在還沒有提供獲取單個Cookie的 , 比方說我現在客戶端放了好多Cookie比如什麼視訊、使用者名稱密碼、圖片,我客戶端要獲取 就必須一次全拿到然後後遍歷
假設剛才現在客戶端現在需要訪問服務端,服務端就是我們準備並且增加Cookie的那個頁面,在那個頁面上 我有重定向 ,重定向到了客戶端列印輸出了,我們看一下執行結果:
很明顯,我們成功的獲取到了服務端發來的Cookie;
下面這個則是 JSessionId,每一個Cookies都會有一個Name為JSessionId,它也是有key v 對。
今日感悟:
不要為了取悅他人而自我犧牲,
比如你為了家庭和睦取悅父母,為了寢室團結取悅舍友,為了情侶和諧取悅物件,
這樣你的情緒就會一直被別人所支配,一直活在別人的脅迫之下,到最後你就明白,你所認為的犧牲,
在別人眼裡,其實一文不值