1. 程式人生 > 其它 >對cookie原始碼的粗淺認識

對cookie原始碼的粗淺認識

1.關於cookie物件的建立

cookie在例項化時只有一個有參建構函式,cookie沒有set函式,只能通過這個有參構造進行鍵值對的設定

在將key和value存入cookie物件之前,會先進行驗證:
如果之前有同key的cookie,會進行一個覆蓋。
如果key輸入不合法,例如為空則報異常

2.request.getCookies();的實現原理

每個頁面除了可能存在的由程式設計師設定的cookie物件外,還有一個必定存在的頁面自帶的cookie——JSESSIONID,由伺服器自動賦予瀏覽器。

如果我們使用request.getCookies();獲取到頁面的cookies物件陣列,然後迴圈列印每一個cookies

那麼我們會獲取到如下的cookies

多次重新整理下,每個cookie存的鍵值對的值不會變化,但是cookies本身會發生改變,這說明每次request.getCookies();返回的cookie物件都不一樣,這就涉及到request.getCookies();方法的底層實現原理

整個方法的底層實現模擬如圖,說明如下:
①String cookieString = request.getHeader("Cookie");
②String[] cookies = cookieString.split("; ");
③String[] cookieStr = s.split("=");

第一個方法是從請求頭中獲取到cookie屬性的所有值,如圖:

這裡麵包含頁面的所有cookie,每個cookie用分號隔開,配合第二個方法進行字串分割,就可以得到一個cookie鍵值對的陣列,如註釋那般,每個索引對應一個cookie鍵值對

進入迴圈後再配合第三個方法切分每個鍵值對,獲得單獨的key和value,再new一個cookie物件並存入值,然後把new的物件存入一個物件陣列,迴圈完畢後把物件陣列輸出。
最終輸出的cookies和直接使用request.getCookies();獲得的cookie物件陣列一樣

這裡面的關鍵點就是new物件 這就是為什麼每次重新整理時getCookies()返回的cookie地址(直接toString輸出的字串)都不一樣的原因

3.cookie在瀏覽器和伺服器之間傳遞的順序

頁面最開始載入後只有伺服器給頁面的一個儲存ID的cookie

當我們執行了servlet中的方法——①建立cookie②傳送cookie給頁面 之後 頁面就存在兩種cookie request和response的

最後 重新整理頁面後,頁面就只存在request cookie 用於瀏覽器傳給伺服器

當瀏覽器向伺服器傳送請求之後,伺服器使用response.addCookie()新增cookie到瀏覽器上,此時cookie物件儲存在瀏覽器上的response cookies中,當瀏覽器下一次傳送其他請求時,在response cookie中的cookie會封裝到訊息頭中,跟隨整個請求頭從瀏覽器傳輸到伺服器上。這次請求完成之後,在瀏覽器上儲存的cookie轉移到request cookie中。