cookie,你好

原文鏈接:https://juejin.im/post/59d1f59bf265da06700b0934

                                          cookie,你好

 

目錄

2、cookie原理

3、cookie不可跨域

4、cookie的屬性

1) name

2) value

3) domain

4) path

5) secure

6)HttpOnly

         5、關於js操作cookie         

         6、服務端如何去設置cookie


http是一個不保存狀態的協議,什麼叫不保存狀態,就是一個服務器是不清楚是不是同一個瀏覽器在訪問他,在cookie之前,有另外的技術是可以解決,這裏簡單講一下,就是在請求中插入一個token,然後在發送請求的時候,把這個東西帶給服務器,這種方式是易出錯,所以有了cookie的出現。
來看一下谷歌瀏覽器的檢查界面(瀏覽器控制檯)
 

cookie是什麼,cookie就是一種瀏覽器管理狀態的一個文件,它有name,也有value,還有其他屬性。 

2、cookie原理

 第一次訪問網站的時候,瀏覽器發出請求,服務器響應請求後,會將cookie放入到響應請求中,在瀏覽器第二次發請求的時候,會把cookie帶過去,服務端會辨別用戶身份,當然服務器也可以修改cookie內容。

3、cookie不可跨域

當我打開百度的網頁,我要設置一個cookie的時候,我的指令如下:
 

javascript:document.cookie='myname=laihuamin;path=/;domain=.baidu.com';
javascript:document.cookie='myname=huaminlai;path=/;domain=.google.com';


當我將這兩個語句都放到瀏覽器控制檯運行的時候,你會發現一點,注意,上面兩個cookie的值是不相同的,看清楚.
 

 顯而易見的是,真正能把cookie設置上去的只有domain是.baidu.com的cookie綁定到了域名上,所以上面所說的不可跨域性,就是不能在不同的域名下用,每個cookie都會綁定單一的域名。

4、cookie的屬性

cookie的屬性衆多。

1) name

這個顯而易見,就是代表cookie的名字的意思,一個域名下綁定的cookie,name不能相同,相同的name的值會被覆蓋掉,有興趣的同學可以試一試,我在項目中切實用到過

2) value

這個就是每個cookie擁有的一個屬性,它表示cookie的值,但是我在這裏想說的不是這個,因爲我在網上看到兩種說法,如下:

1.cookie的值必須被URL編碼

2.對cookie的值進行編碼不是必須的,還舉了原始文檔中所說的,僅對三種符號必須進行編碼:分號、逗號和空格

這個東西得一分爲二來看,先看下面的圖
 

3) domain

這個是指的域名,這個代表的是,cookie綁定的域名,如果沒有設置,就會自動綁定到執行語句的當前域,還有值得注意的點,統一個域名下的二級域名也是不可以交換使用cookie的,比如,你設置www.baidu.com和image.baidu.com,依舊是不能公用的

4) path

path這個屬性默認是'/',這個值匹配的是web的路由,舉個例子:

//默認路徑
www.baidu.com
//blog路徑
www.baidu.com/blog

我爲什麼說的是匹配呢,就是當你路徑設置成/blog的時候,其實它會給/blog、/blogabc等等的綁定cookie。
cookie的有效期

什麼是有效期,就是圖中的Expires屬性,一般瀏覽器的cookie都是默認儲存的,當關閉瀏覽器結束這個會話的時候,這個cookie也就會被刪除,這就是上圖中的——session(會話儲存)。

如果你想要cookie存在一段時間,那麼你可以通過設置Expires屬性爲未來的一個時間節點,Expires這個是代表當前時間的,這個屬性已經逐漸被我們下面這個主人公所取代——Max-Age

Max-Age,是以秒爲單位的,Max-Age爲正數時,cookie會在Max-Age秒之後,被刪除,當Max-Age爲負數時,表示的是臨時儲存,不會生出cookie文件,只會存在瀏覽器內存中,且只會在打開的瀏覽器窗口或者子窗口有效,一旦瀏覽器關閉,cookie就會消失,當Max-Age爲0時,又會發生什麼呢,刪除cookie,因爲cookie機制本身沒有設置刪除cookie,失效的cookie會被瀏覽器自動從內存中刪除,所以,它實現的就是讓cookie失效。

5) secure
 

 

這個屬性譯爲安全,http不僅是無狀態的,還是不安全的協議,容易被劫持,打個比方,你在手機端瀏覽網頁的時候,有沒有中國移動圖標跳出來過,閒言少敘,當這個屬性設置爲true時,此cookie只會在https和ssl等安全協議下傳輸

  • 提示:這個屬性並不能對客戶端的cookie進行加密,不能保證絕對的安全性

6)HttpOnly

這個屬性是面試的時候常考的,如果這個屬性設置爲true,就不能通過js腳本來獲取cookie的值,能有效的防止xss攻擊。

document.cookie可以對cookie進行讀寫,看一下兩條指令:

//讀取瀏覽器中的cookie
console.log(document.cookie);
//寫入cookie
document.cookie='myname=laihuamin;path=/;domain=.baidu.com';

關於怎麼設置cookie,我們只要打開控制檯,看一個http的請求頭和響應頭中的東西即可明白:
 

 
服務器去除cookie的原理:首先得明白,在服務器端是不能直接刪除客戶端的cookie。它採取的方式是在服務端設置cookie.setMaxAge(0),再通過 response.addCookie(cookie) 將這個值返回到客戶端後,客戶端就知道自己的cookie沒用了,再刪除它。 故 response.addCookie(cookie); 不能省略,它是一個告知的功能。
添加cookie的例子:

public static void addCookie(HttpServletResponse response, String name, String value, int maxAge, String domain) {
        Cookie cookie = new Cookie(name, value);
        cookie.setMaxAge(maxAge);
        cookie.setPath("/");
        cookie.setDomain(domain);
        response.addCookie(cookie);
    }

將一個對象添加到cookie的例子:

public static void addObjectToCookie(long userId, String username, HttpServletResponse response) {
        String cookieName = "cookieName";
        JSONObject object = new JSONObject();
        object.put("userId", userId);
        object.put("username", username);
        object.put("loginTime", System.currentTimeMillis());
        String cookie_token = new String(Base64.encodeBase64(encrypt(object.toString().getBytes(), AuthKey.getBytes())));
        addCookie(response, cookieName, cookie_token, 1024);
    }

對cookie值的編碼和解碼:

傳送時編碼:
URLEncoder.encode("陳強", "UTF-8");
讀取時解碼:
cookies = request.getCookies();
   if( cookies != null ){
      for (int i = 0; i < cookies.length; i++){
         URLDecoder.decode(cookies[i].getValue(),"UTF-8");
         cookie.getName();
      }




 

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