cookie入門

来源:http://www.cnblogs.com/Uncle-Keith/archive/2016/11/16/6069537.html
-Advertisement-
Play Games

據我對cookie誕生背景的瞭解,cookie是由網景公司創建的,目的就是將用戶的數據儲存在客戶端上。伴隨的HTML5的出現,現在又有另外一個解決數據離線儲存的方案,就是HTML5中的Web storage,其中兩個重要對象sessionStorage和localStorage可以解決瀏覽器sess ...


據我對cookie誕生背景的瞭解,cookie是由網景公司創建的,目的就是將用戶的數據儲存在客戶端上。伴隨的HTML5的出現,現在又有另外一個解決數據離線儲存的方案,就是HTML5中的Web storage,其中兩個重要對象sessionStorage和localStorage可以解決瀏覽器sessions和長期儲存數據的目的,並且相容性還不錯,IE8+以上瀏覽器都支持。

那我們直接學習Web storage不就可以了?個人認為,這不是一個很好的學習方法。Web Storage的出現主要還是因為cookie的一些小毛病不能夠滿足前端工程師日常開發而被加入到HTML5中作為新的API的。本質上說,localStorage和sessionStorage實現的本質與cookie是一樣的。所以在接觸之前,先熟悉並且掌握cookie對於Web storage的學習還有很大的幫助。

這篇文章會涉及的內容與技術:

  • module bundler:webpack
  • javascirpt如何實現讀取,寫入,刪除Cookie
  • js-cookie實現讀取,寫入,刪除Cookie

cookie定義

cookie其實就是伺服器保存在瀏覽器的一小段文本信息。怎麼保存呢?瀏覽器在向伺服器發送一個http請求時,會在發送請求的首部欄位中添加Cookie欄位,並且附上相應的key,value。伺服器接收到請求並且正確返迴響應的時候,會在響應的頭部欄位中添加Set-cookie欄位。這時候就完成了一次數據儲存的操作。當我們關閉瀏覽器並且再次打開的時候,相應需要存儲的信息就會在expires指定的期限記憶體儲下來。

簡單的說,就是:

  • 當用戶訪問web頁面時,他的記錄可以保存在cookie中。
  • 在用戶下一次訪問同一頁面時,可以在cookie中讀取用戶的訪問記錄。

cookie特點

  • 每個cookie的大小不能超過4KB。
  • 通過HTTP協議的方式來存儲數據。
  • cookie會影響同一功能變數名稱下的根目錄及其子目錄。舉例來說,如果當前URI是keithchou.github.io,如果設置path為'/'或者不設置(預設值為/),這個cookie對該功能變數名稱的根路徑和它的所有子路徑都有效。如果path設置為/music,那麼這個cookie只有在訪問keithchou.github/music及其子路徑才有效。
  • 同源政策。瀏覽器的同源政策規定,兩個網址只要功能變數名稱和埠相同,就可以共用cookie。註意,這裡不要求協議相同。也就是說,'http://keithchou.com'設置的cookie,可以被'https://keithchou.com'讀取

cookie屬性

cookie常用的屬性有:

  • value
  • domain
  • path
  • expires
  • secure
  • HttpOnly

屬性的具體內容就不再贅述了,屬性都比較簡單。

cookie實現

接下來想說說兩種方式來實現cookie。一是原生javascript實現cookie,二是通過js-cookie這個小框架來實現cookie。

javascript實現數據存儲

基本的cookie操作有三種:讀取、寫入和刪除。javascript操作cookie主要是通過document.cookie來實現的。

document.cookie的一大特點是,可以讀取所有的Cookie,但是每次寫入cookie的時候只能一條一條寫入。看一個從百度獲取的cookie。

//讀取cookie,一次性獲取所有cookie。   
console.log(document.cookie);

//每個cookie都是以鍵值對的形式存在,並且通過;分隔。
"BAIDUID=9BD404162B2978E266B82B0D052A12D7:FG=1; BIDUPSID=605A0EB7E85170299BCFFF6C2B042840; PSTM=1474937533; BD_UPN=13314752; ispeed_lsm=6; BDRCVFR[Fc9oatPmwxn]=G01CoNuskzfuh-zuyuEXAPCpy49QhP8; BD_HOME=0; H_PS_PSSID=1440_21421_18240_21116_21454_21377_21526_21191_21399; BD_CK_SAM=1; PSINO=7; H_PS_645EC=9c44kg7jUnDfYs5vfqg9n3QbElgAvuf8phS5ZsmD2FIE2KxSARX534GRQw1z7f0cZ6wu; locale=zh; pgv_pvi=4703388672; pgv_si=s5301332992"

//寫入cookie,只能一條一條寫入。
document.cookie = 'unclekeith=21';
document.cookie = 'sex=boy';
...

原生javascript實現cookie的方法如下。此代碼摘自《javascript高級程式設計 第三版》。

var CookieUtil = { 
    //讀取cookie,判斷某個cookie是否存在。
    //讀取操作配合 unclekeith=21; sex=boy 這個cookie會更好理解讀取cookie的操作。
    get: function (name){ 
        var cookieName = encodeURIComponent(name) + "=", 
            cookieStart = document.cookie.indexOf(cookieName), 
            cookieValue = null; 
        if (cookieStart > -1){ 
            var cookieEnd = document.cookie.indexOf(";", cookieStart); 
            if (cookieEnd == -1){ 
                cookieEnd = document.cookie.length; 
            } 
            cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd)); 
    } 
        return cookieValue; 
    }, 
    //寫入cookie。
    set: function (name, value, expires, path, domain, secure) { 
        var cookieText = encodeURIComponent(name) + "=" + 
                         encodeURIComponent(value); 
        if (expires instanceof Date) { 
            cookieText += "; expires=" + expires.toGMTString(); 
        } 
        if (path) { 
            cookieText += "; path=" + path; 
        }   
        if (domain) { 
            cookieText += "; domain=" + domain; 
        } 
        if (secure) { 
            cookieText += "; secure"; 
        } 
        document.cookie = cookieText; 
    }, 
    //刪除cookie
    unset: function (name, path, domain, secure){ 
        this.set(name, "", new Date(0), path, domain, secure); 
    } 
}; 

javascript實現cookie的代碼並不複雜,只要有javascript基礎,基本上都可以看懂。給出原生javascript實現cookie的操作是因為要去實際的瞭解一下整個過程,不然使用前端大牛封裝好的庫來實現cookie總感覺有一些東西特別難以理解。

首先我想說的是,網上大量的資料都是對$.cookie進行介紹的。官網明確指出這個項目已經不再繼續維護了。為什麼還要使用阿?所以不再介紹。這裡要介紹另外一個實現cookie的庫。js-cookie。具體的api在官網上有詳細的介紹。傳送門:js-cookie

首先,進入本地項目,通過cnpm安裝js-cookie。

cnpm install js-cookie --save

然後,在使用webpack中的入口文件entry.js引入js-cookie。

import Cookies from 'js-cookie';

當然,接下來就可以使用了。下麵是一個登錄界面的小demo。

html部分
<p>
    <label for="username">用戶名:</label>
    <input type="text" id='username' name='username' placeholder="請輸入用戶名">
</p>
<p>
    <label for="password">密碼:</label>
    <input type="password" id='password' name='password' placeholder="請輸入密碼">
</p>
<p>
    <label for="confirm_password">再次輸入密碼:</label>
    <input type="password" id='confirm_password' name='confirm_password' placeholder="再次輸入密碼">
    <input type="checkbox" id='rememberUser'>
    <label for="rememberUser">記住用戶名</label>
</p>

//js部分
//先判斷瀏覽器是否儲存有對應的cookie。
if (Cookies.get('username')) {
    $("#username").val(Cookies.get('username'));
    $('#rememberUser').attr('checked',true);
};

if (Cookies.get('password')) {
    $('#password').val(Cookies.get('password'));
    $('#confirm_password').val(Cookies.get('password'));
}

//設置cookie。當點擊 記住用戶名 操作時儲存相應的數據。
$('#rememberUser').click(function(){
    if (this.checked) {
        if ($('#username').val() ==='') {
            alert('請輸入用戶名');
            this.checked = false;
        } else {
            Cookies.set('username',$('#username').val(),{
                path:'/',
                expires: 1
            });
            Cookies.set('password',$('#password').val(),{
                path:'/',
                expires: 1
            })
        }
    }
});

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概述 迭代器模式提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露其內部的表示。 二、解決問題 迭代器模式就是提供一種遍歷元素的統一介面,用一致的方法遍歷聚合元素。試想,如果我們的聚合元素是用不同的方式實現的,有些用了數組,有些用了java的集合類,或者還有其他方式,當客戶端要遍歷這些元素 ...
  • 原文地址 序列圖主要用於展示對象之間交互的順序。 序列圖將交互關係表示為一個二維圖。縱向是時間軸,時間沿豎線向下延伸。橫向軸代表了在協作中各獨立對象的類元角色。類元角色用生命線表示。當對象存在時,角色用一條虛線表示,當對象的過程處於激活狀態時,生命線是一個雙道線。 消息用從一個對象的生命線到另一個對 ...
  • aop( aspect oriented programming ) 面向切麵編程,是對所有對象或者是一類對象編程 幾個重要的概念: 1.切麵(aspect):要實現的交叉功能,是系統模塊化的一個切麵或領域。如日誌記錄。 2.連接點:應用程式執行過程中插入切麵的地點,可以是方法調用,異常拋出,或者要 ...
  • 第一個FreeMarker程式 1. 建立一個普通的java項目:testFreeMarker 2. 引入freemarker.jar包 3. 在項目目錄下建立模板目錄:templates 4. 在templates目錄下,建立a.ftl模板文件,內容如下: 5. 建立com.sxt.test.fr ...
  • 主體思想:狀態決定行為。 應用環境:同一對象,在狀態轉換過程中,行為隨著狀態一直在改變。 e.g. 燈初始狀態是關閉的,按一下開啟,再按一下關閉(不要跟我說你家的水晶變色大燈)。在這一個過程中,觸發行為都是按一下開關,電燈會根據自身狀態的不同調用不同的行為去實現。如果我們不適用設計模式去實現著這段邏 ...
  • 隨著樂視硬體搶購的不斷升級,樂視集團支付面臨的請求壓力百倍乃至千倍的暴增。作為商品購買的最後一環,保證用戶快速穩定地完成支付尤為重要。所以在2015年11月,我們對整個支付系統進行了全面的架構升級,使之具備了每秒穩定處理10萬訂單的能力。為樂視生態各種形式的搶購秒殺活動提供了強有力的支撐。 一. 分 ...
  • 一、代碼 二、預覽效果如上圖,ie9及以上背景色能顯示問題:如上圖,ie8背景色顯示不出來 三、解決方法 四、css其他選擇器 :nth-of-type() 選擇器 ——選擇器匹配屬於父元素的特定類型的第 N 個子元素的每個元素. n 可以是數字、關鍵詞或公式。與:nth-child(n)不同的是後 ...
  • 前端學習還是很有趣的,可以較快的上手然後自己開發一些好玩的項目來練手,網上也可以一抓一大把關於前端開發的小項目,可是還是有新手在學習的時候不知道可以做什麼,以及怎麼做,因此, "實驗樓" 就整理了一些前端項目教程,希望可以幫助正在學習前端的小伙伴。 為了方便閱讀,大概把前端可以做的項目分為三類: 游 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...