cookie VS sessionstorge VS localstorge

来源:http://www.cnblogs.com/lily1010/archive/2016/07/12/5661937.html
-Advertisement-
Play Games

雖然cookie , localstorge , sessionstorge三者都有存儲的功能,但是還是有區別, git上地址:https://github.com/lily1010/cookie-storge 我個人的總結如下: 一 Cookie問題 ①Cookie是什麼 Cookie 是一小段文 ...


雖然cookie , localstorge , sessionstorge三者都有存儲的功能,但是還是有區別,

git上地址:https://github.com/lily1010/cookie-storge

我個人的總結如下:

一 Cookie問題

①Cookie是什麼

Cookie 是一小段文本信息,伴隨著用戶請求和頁面在 Web 伺服器和瀏覽器之間傳遞。用戶每次訪問站點時,Web 應用程式都可以讀取 Cookie 包含的信息,簡單描述Cookie就像是訪問伺服器時伺服器頒發給用戶的“身份證”,下次訪問的時候帶回這身份證,伺服器就能識別信息。

②Cookie特點

--如果不為Cookie設置它的生存周期的話,預設是關閉瀏覽器的時候就銷毀Cookie。

--Cookie預設情況下是不允許出現中文字元的,如果我們要添加具有中文內容的Cookie時,我們需要使用java.net.URLEncoder先對中文進行編碼,隨後在進行Cookie的添加。讀取Cookie時,需要使用java.net.URLDecoder對其進行解碼。

--不同的瀏覽器對Cookie的存儲都有一些限制,通常是Cookie數量和Cookie總大小的限制。像火狐對Cookie的限制是每個功能變數名稱只能有50個Cookie值,總大小不能超過4097個字。

--Cookie在HTTP的頭部,如果Cookie的量非常大,要做Cookie做壓縮,壓縮方法是將Cookie的多個K/V看作是普通的文本,做文本壓縮。Cookie的規範中規定,Cookie僅能保存ASCII碼為34~126的可見字元。

③Cookie缺點

--每次都跟隨用戶請求發送給伺服器,浪費帶寬。

--只能存固定長度的字元

--存不了複雜的數據,比如對象

--cookie還需要指定作用域,不可以跨域調用

--cookie需要前端開發者自己封裝setCookie,getCookie方法

 

二 html5中 sessionstorge和localstorge問題

html5中的Web Storage包括了兩種存儲方式:sessionStorage和localStorage。為了更大容量存儲和複雜數據而設計的除此之外,它倆有setItem,getItem,removeItem,clear等方法

①sessionStorage是什麼?

sessionStorage用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問並且當會話結束後數據也隨之銷毀。因此sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。

②localStorage是什麼?

localStorage用於持久化的本地存儲,除非主動刪除數據,否則數據是永遠不會過期的。

③它們的數據處理方法

// 保存數據到sessionStorage
sessionStorage.setItem('key', 'value');

// 從sessionStorage獲取數據
var data = sessionStorage.getItem('key');

// 清空sessionStorage選定數據
var data = sessionStorage.removeItem("key");

// 清空sessionStorage所有數據
var data = sessionStorage.clear();

 

 

三 storage事件

先來看看storage事件的文檔說明

The storage event is fired when a storage area changes, as described in the previous two sections (for session storage, for local storage).

When this happens, the user agent must queue a task to fire an event with the name storage, which does not bubble and is not cancelable, and which uses the StorageEvent interface, at each Window object whose Document 
object has a Storage object that is affected.

翻譯過來,當存儲的storage數據發生變化時都會觸發它,但是它不同於click類的事件會冒泡和能取消,同時最後這句才是重點,storage改變的時候,觸發這個事件會調用所有同域下其他視窗的storage事件,不過它本身觸發storage即當前視窗是不會觸發這個事件的

下麵來看我的文件目錄:

其中test1.html內容是:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    </head>
    <body>
        <input type="text" placeholder="請輸入"> 
        <button>保存數據</button>
        <script type="text/javascript">
        // 保存數據到sessionStorage
        //sessionStorage.setItem('key', 'value');
        
        // 從sessionStorage獲取數據
        //var data = sessionStorage.getItem('key');
            
        // 清空sessionStorage選定數據
        //var data = sessionStorage.removeItem("key");
            
        // 清空sessionStorage所有數據
        //var data = sessionStorage.clear();
            var val = document.getElementsByTagName("input")[0];  
        var btn = document.getElementsByTagName("button")[0];  
        btn.onclick = function(){  
          var value = val.value;  
          if(!value) return;  
          localStorage.setItem("key", val.value);  
        };
            if(window.addEventListener){
                window.addEventListener("storage",handle_storage,false); 
            }else if(window.attachEvent){     
                window.attachEvent("onstorage",handle_storage); 
            }
            function handle_storage(e){     
                console.log(e);  
            document.write("oldValue: "+ e.oldValue + " newValue:" + e.newValue)  
            }
        </script>
    </body>
</html>

 

其中test2.html內容是:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
        <script type="text/javascript">
            if(window.addEventListener){
                window.addEventListener("storage",handle_storage,false); 
            }else if(window.attachEvent){     
                window.attachEvent("onstorage",handle_storage); 
            }
            function handle_storage(e){     
                console.log(e);  
            document.write("oldValue: "+ e.oldValue + " newValue:" + e.newValue)  
            }
        </script>
    </body>
</html>

經過測試得出結論:(ps:前提頁面test1.html和test2.html在同域下,並都是打開狀態不同視窗)

頁面test1.html下,有個input框用來存儲store,它自身綁定了storage事件,這個時候寫入新的數據點擊保存,這時新的sotre數據保存了,但是頁面test1.html的storage事件沒觸發,而頁面test2.html下,綁定的storage事件則觸發了.

 

問題①:既然改變的是同域下的其他頁面數據,那麼storage事件應用在那裡?

答:多視窗間多通信用到它就是最好選擇了,比如某塊公用內容區域基礎數據部分都是從store中提取的,這個區域中大多數頁面中都有,當用戶打開多個頁面時,在其中一個頁面做了數據修改,那其他頁面同步更新是不是很方便(當前頁面就要用其他方式處理了),當然用於視窗間通信它作用不僅僅如此,更多的大家可以利用它特性去發揮。

問題②:storage的events對象的常用屬性有哪些?

 oldValue:更新前的值。如果該鍵為新增加,則這個屬性為null。 

 newValue:更新後的值。如果該鍵被刪除,則這個屬性為null。

 url:原始觸發storage事件的那個網頁的網址。 

 key:存儲store的key名;


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

-Advertisement-
Play Games
更多相關文章
  • 周末在江邊晨跑的時候發現很多 當時心血來潮就想,應該可以在網頁中實現一下 這幾天得閑就做了一下,效果如下 (儘量在最新版本的chrome或者firefox中查看) demo下載在文章最後 預覽 <!-- --> <!-- --> <!-- --> <!-- --> <!-- --> <!-- --> ...
  • 他的官網:http://docs.emmet.io/ 給廣大程式員節省時間 Value aliases Emmet has a few aliases for commonly used values: p → % e → em x → ex You can use aliases instead ...
  • 1.什麼是響應式設計? 響應式設計就是在網站開發過程中根據用戶操作以及設備的環境進行相應的操作和佈局,讓網站針對不同系統平臺、屏幕尺寸、屏幕定向等進行智能化調整,進行相對應的佈局,如在pc端、iphone、Android、ipad,實現了在智能手機和平板電腦等多種智能移動終端瀏覽效果的流暢,防止頁面 ...
  • 同樣的也是上課的時候發現學生難以理解的一些問題拿出來記錄一下,希望幫助初學者。 在css中定位屬性position的運用在頁面中是很常用的,特別是一些結合js來實現的一些特效經常會用到定位屬性,比如滑鼠滑過顯示被隱藏的盒子, banner的切換,還有之前寫的jquery實現京東商品分類導航的類似這樣 ...
  • LayaAir是LayaBox推出的Html5游戲引擎,支持 ActionScript3、TypeScript、JavaScript,開源,並且商用免費。 LayaAir IDE 是一款使用LayaAir 引擎來開發應用,游戲的集成開發環境。 LayaAir IDE 下載地址: http://pan ...
  • 回歸下原生js,網上看到的AJAX封裝,遂拿來改改,不知還有何弊端,望指出! 假設一個需求,後端要求傳入兩個數字n1、n2,然後返回總和。 當其中一個參數為空或者不是數字時,返回:{"status":"0", "msg":"參數有誤!"} 當正確的時候,返回:{"status":"1", "sum" ...
  • 隨著Css3和html5的風靡,越來越多的前端人員開始學習Css3,今天的文章就是來說說前端應該掌握10個Css3屬性。 1. Border-radius Border-radius是一大堆CSS3屬性中最受歡迎的一種,border-radius是CSS3中級別最高的一個屬性。當設計者害怕一個層在將 ...
  • 先來跟大家說說什麼是JQ , JQ是java script Jquery版本庫的縮寫. jQuery是一套跨瀏覽器的JavaScript庫,簡化HTML與JavaScript之間的操作。由John Resig在2006年1月的BarCamp NYC上發佈第一個版本。目前是由 Dave Methvin ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...