成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript本地存儲(chǔ)小結(jié)

garfileo / 2290人閱讀

摘要:不是很安全,別人可以分析存放在本地的并進(jìn)行欺騙,考慮到安全應(yīng)當(dāng)使用。因此不是一種持久化的本地存儲(chǔ),僅僅是會(huì)話級(jí)別的存儲(chǔ)。用于持久化的本地存儲(chǔ),除非主動(dòng)刪除數(shù)據(jù),否則數(shù)據(jù)是永遠(yuǎn)不會(huì)過(guò)期的。

前言

總括:詳細(xì)講述Cookie,LocalStorge,SesstionStorge的區(qū)別和用法。

人生如畫,歲月如歌。

原文博客地址:Javascript本地存儲(chǔ)小結(jié)

知乎專欄&&簡(jiǎn)書專題:前端進(jìn)擊者(知乎)&&前端進(jìn)擊者(簡(jiǎn)書)

1. 各種存儲(chǔ)方案的簡(jiǎn)單對(duì)比

Cookies:瀏覽器均支持,容量為4KB

UserData:僅IE支持,容量為64KB

Flash:100KB,非HTML原生,需要插件支持

Google Gears SQLite :需要插件支持,容量無(wú)限制

LocalStorage:HTML5,容量為5M

SesstionStorage:HTML5,容量為5M

globalStorage:Firefox獨(dú)有的,F(xiàn)irefox13開(kāi)始就不再支持這個(gè)方法

UserData僅IE支持, Google Gears SQLite需要插件,F(xiàn)lash已經(jīng)伴隨著HTML5的出現(xiàn)漸漸退出了歷史舞臺(tái),因此今天我們的主角只有他們?nèi)齻€(gè):Cookie,LocalStorge,SesstionStorge;

2. Cookie

作為一個(gè)前端和Cookie打交道的次數(shù)肯定不會(huì)少了,Cookie算是比較古老的技術(shù)了
1993 年,網(wǎng)景公司雇員 Lou Montulli 為了讓用戶在訪問(wèn)某網(wǎng)站時(shí),進(jìn)一步提高訪問(wèn)速度,同時(shí)也為了進(jìn)一步實(shí)現(xiàn)個(gè)人化網(wǎng)絡(luò),發(fā)明了今天廣泛使用的 Cookie。

2.1 Cookie的特點(diǎn)

我們先來(lái)看下Cookie的特點(diǎn):

1)cookie的大小受限制,cookie大小被限制在4KB,不能接受像大文件或郵件那樣的大數(shù)據(jù)。

2)只要有請(qǐng)求涉及cookie,cookie就要在服務(wù)器和瀏覽器之間來(lái)回傳送(這解釋為什么本地文件不能測(cè)試cookie)。而且cookie數(shù)據(jù)始終在同源的http請(qǐng)求中攜帶(即使不需要),這也是Cookie不能太大的重要原因。正統(tǒng)的cookie分發(fā)是通過(guò)擴(kuò)展HTTP協(xié)議來(lái)實(shí)現(xiàn)的,服務(wù)器通過(guò)在HTTP的響應(yīng)頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應(yīng)的cookie。

3)用戶每請(qǐng)求一次服務(wù)器數(shù)據(jù),cookie則會(huì)隨著這些請(qǐng)求發(fā)送到服務(wù)器,服務(wù)器腳本語(yǔ)言如PHP等能夠處理cookie發(fā)送的數(shù)據(jù),可以說(shuō)是非常方便的。當(dāng)然前端也是可以生成Cookie的,用js對(duì)cookie的操作相當(dāng)?shù)姆爆?,瀏覽器只提供document.cookie這樣一個(gè)對(duì)象,對(duì)cookie的賦值,獲取都比較麻煩。而在PHP中,我們可以通過(guò)setcookie()來(lái)設(shè)置cookie,通過(guò)$_COOKIE這個(gè)超全局?jǐn)?shù)組來(lái)獲取cookie。

cookie的內(nèi)容主要包括:名字,值,過(guò)期時(shí)間,路徑和域。路徑與域一起構(gòu)成cookie的作用范圍。若不設(shè)置過(guò)期時(shí)間,則表示這個(gè)cookie的生命期為瀏覽器會(huì)話期間,關(guān)閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會(huì)話期的cookie被稱為會(huì)話cookie。會(huì)話cookie一般不存儲(chǔ)在硬盤上而是保存在內(nèi)存里,當(dāng)然這種行為并不是規(guī)范規(guī)定的。若設(shè)置了過(guò)期時(shí)間,瀏覽器就會(huì)把cookie保存到硬盤上,關(guān)閉后再次打開(kāi)瀏覽器,這些cookie仍然有效直到超過(guò)設(shè)定的過(guò)期時(shí)間。存儲(chǔ)在硬盤上的cookie可以在不同的瀏覽器進(jìn)程間共享,比如兩個(gè)IE窗口。而對(duì)于保存在內(nèi)存里的cookie,不同的瀏覽器有不同的處理方式。

2.2 Session

說(shuō)到Cookie就不能不說(shuō)Session。

Session機(jī)制。session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session時(shí),服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)session標(biāo)識(shí)(稱為session id),如果已包含則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)session,服務(wù)器就按照session id把這個(gè)session檢索出來(lái)使用(檢索不到,會(huì)新建一個(gè)),如果客戶端請(qǐng)求不包含session id,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id,session id的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)session id將被在本次響應(yīng)中返回給客戶端保存。保存這個(gè)session id的方式可以采用cookie,這樣在交互過(guò)程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)送給服務(wù)器。一般這個(gè)cookie的名字都是類似于SEEESIONID。但cookie可以被人為的禁止,則必須有其他機(jī)制以便在cookie被禁止時(shí)仍然能夠把session id傳遞回服務(wù)器。經(jīng)常被使用的一種技術(shù)叫做URL重寫,就是把session id直接附加在URL路徑的后面。比如:http://damonare.cn?sessionid=123456還有一種技術(shù)叫做表單隱藏字段。就是服務(wù)器會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器。比如:

實(shí)際上這種技術(shù)可以簡(jiǎn)單的用對(duì)action應(yīng)用URL重寫來(lái)代替。

2.3 Cookie和Session簡(jiǎn)單對(duì)比

Cookie和Session 的區(qū)別:

1)cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。

2)cookie不是很安全,別人可以分析存放在本地的cookie并進(jìn)行cookie欺騙,考慮到安全應(yīng)當(dāng)使用session。

3)session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用cookie。

4)單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。

5)所以建議:

將登陸信息等重要信息存放為SESSION

其他信息如果需要保留,可以放在cookie中

2.4 document.cookie的屬性

expires屬性

指定了coolie的生存期,默認(rèn)情況下coolie是暫時(shí)存在的,他們存儲(chǔ)的值只在瀏覽器會(huì)話期間存在,當(dāng)用戶推出瀏覽器后這些值也會(huì)丟失,如果想讓cookie存在一段時(shí)間,就要為expires屬性設(shè)置為未來(lái)的一個(gè)過(guò)期日期。現(xiàn)在已經(jīng)被max-age屬性所取代,max-age用秒來(lái)設(shè)置cookie的生存期。

path屬性

它指定與cookie關(guān)聯(lián)在一起的網(wǎng)頁(yè)。在默認(rèn)的情況下cookie會(huì)與創(chuàng)建它的網(wǎng)頁(yè),該網(wǎng)頁(yè)處于同一目錄下的網(wǎng)頁(yè)以及與這個(gè)網(wǎng)頁(yè)所在目錄下的子目錄下的網(wǎng)頁(yè)關(guān)聯(lián)。

domain屬性

domain屬性可以使多個(gè)web服務(wù)器共享cookie。domain屬性的默認(rèn)值是創(chuàng)建cookie的網(wǎng)頁(yè)所在服務(wù)器的主機(jī)名。不能將一個(gè)cookie的域設(shè)置成服務(wù)器所在的域之外的域。例如讓位于order.damonare.cn的服務(wù)器能夠讀取catalog.damonare.cn設(shè)置的cookie值。如果catalog.damonare.cn的頁(yè)面創(chuàng)建的cookie把自己的path屬性設(shè)置為“/”,把domain屬性設(shè)置成“.damonare.cn”,那么所有位于catalog.damonare.cn的網(wǎng)頁(yè)和所有位于orlders.damonare.cn的網(wǎng)頁(yè),以及位于damonare.cn域的其他服務(wù)器上的網(wǎng)頁(yè)都可以訪問(wèn)這個(gè)cookie。

secure屬性

它是一個(gè)布爾值,指定在網(wǎng)絡(luò)上如何傳輸cookie,默認(rèn)是不安全的,通過(guò)一個(gè)普通的http連接傳輸

2.5 cookie實(shí)戰(zhàn)

這里我們使用javascript來(lái)寫一段cookie,借用w3cschool的demo:

function getCookie(c_name){
    if (document.cookie.length>0){
        c_start=document.cookie.indexOf(c_name + "=")
        if (c_start!=-1){
            c_start=c_start + c_name.length+1
            c_end=document.cookie.indexOf(";",c_start)
            if (c_end==-1) c_end=document.cookie.length
            return unescape(document.cookie.substring(c_start,c_end))
        }
    }
    return "";
}

function setCookie(c_name,value,expiredays){
    var exdate=new Date()
    exdate.setDate(exdate.getDate()+expiredays)
    document.cookie=c_name+ "=" +escape(value)+
            ((expiredays==null) ? "" : "; expires="+exdate.toUTCString())
}
function checkCookie(){
    username=getCookie("username")
    if(username!=null && username!=""){alert("Welcome again "+username+"!")}
    else{
        username=prompt("Please enter your name:","")
        if (username!=null && username!=""){
            setCookie("username",username,355)
        }
    }
}

注意這里對(duì)Cookie的生存期進(jìn)行了定義,也就是355天

3. localStorage

這是一種持久化的存儲(chǔ)方式,也就是說(shuō)如果不手動(dòng)清除,數(shù)據(jù)就永遠(yuǎn)不會(huì)過(guò)期。

它也是采用Key - Value的方式存儲(chǔ)數(shù)據(jù),底層數(shù)據(jù)接口是sqlite,按域名將數(shù)據(jù)分別保存到對(duì)應(yīng)數(shù)據(jù)庫(kù)文件里。它能保存更大的數(shù)據(jù)(IE8上是10MB,Chrome是5MB),同時(shí)保存的數(shù)據(jù)不會(huì)再發(fā)送給服務(wù)器,避免帶寬浪費(fèi)。

3.1 localStorage的屬性方法

下表是localStorge的一些屬性和方法

屬性方法 說(shuō)明
localStorage.length 獲得storage中的個(gè)數(shù)
localStorage.key(n) 獲得storage中第n個(gè)元素對(duì)的鍵值(第一個(gè)元素是0)
localStorage.getItem(key) 獲取鍵值key對(duì)應(yīng)的值
localStorage.key 獲取鍵值key對(duì)應(yīng)的值
localStorage.setItem(key, value) 添加數(shù)據(jù),鍵值為key,值為value
localStorage.removeItem(key) 移除鍵值為key的數(shù)據(jù)
localStorage.clear() 清除所有數(shù)據(jù)
3.2 localStorage的缺點(diǎn)

① localStorage大小限制在500萬(wàn)字符左右,各個(gè)瀏覽器不一致

② localStorage在隱私模式下不可讀取

③ localStorage本質(zhì)是在讀寫文件,數(shù)據(jù)多的話會(huì)比較卡(firefox會(huì)一次性將數(shù)據(jù)導(dǎo)入內(nèi)存,想想就覺(jué)得嚇人?。?/p>

④ localStorage不能被爬蟲爬取,不要用它完全取代URL傳參

4. sessionStorage

和服務(wù)器端使用的session類似,是一種會(huì)話級(jí)別的緩存,關(guān)閉瀏覽器會(huì)數(shù)據(jù)會(huì)被清除。不過(guò)有點(diǎn)特別的是它的作用域是窗口級(jí)別的,也就是說(shuō)不同窗口間的sessionStorage數(shù)據(jù)不能共享的。使用方法(和localStorage完全相同):

屬性方法 說(shuō)明
sessionStorage.length 獲得storage中的個(gè)數(shù)
sessionStorage.key(n) 獲得storage中第n個(gè)元素對(duì)的鍵值(第一個(gè)元素是0)
sessionStorage.getItem(key) 獲取鍵值key對(duì)應(yīng)的值
sessionStorage.key 獲取鍵值key對(duì)應(yīng)的值
sessionStorage.setItem(key, value) 添加數(shù)據(jù),鍵值為key,值為value
sessionStorage.removeItem(key) 移除鍵值為key的數(shù)據(jù)
sessionStorage.clear() 清除所有數(shù)據(jù)
5. sessionStorage和localStorage的區(qū)別

sessionStorage用于本地存儲(chǔ)一個(gè)會(huì)話(session)中的數(shù)據(jù),這些數(shù)據(jù)只有在同一個(gè)會(huì)話中的頁(yè)面才能訪問(wèn)并且當(dāng)會(huì)話結(jié)束后數(shù)據(jù)也隨之銷毀。因此sessionStorage不是一種持久化的本地存儲(chǔ),僅僅是會(huì)話級(jí)別的存儲(chǔ)。當(dāng)用戶關(guān)閉瀏覽器窗口后,數(shù)據(jù)立馬會(huì)被刪除。

localStorage用于持久化的本地存儲(chǔ),除非主動(dòng)刪除數(shù)據(jù),否則數(shù)據(jù)是永遠(yuǎn)不會(huì)過(guò)期的。第二天、第二周或下一年之后,數(shù)據(jù)依然可用。

5.1 測(cè)試

sessionStorage:

if (sessionStorage.pagecount){
    sessionStorage.pagecount=Number(sessionStorage.pagecount) +1;
}else{
      sessionStorage.pagecount=1;
}
console.log("Visits "+ sessionStorage.pagecount + " time(s).");

測(cè)試過(guò)程:我們?cè)诳刂婆_(tái)輸入上述代碼查看打印結(jié)果

控制臺(tái)首次輸入代碼:

關(guān)閉窗口,控制臺(tái)再次輸入代碼:

所謂的關(guān)閉窗口即銷毀,就是這樣,關(guān)閉窗口重新打開(kāi)輸入代碼輸出結(jié)果還是上面圖片的樣子,也就是說(shuō)關(guān)閉窗口后sessionStorage.pagecount即被銷毀,除非重心創(chuàng)建。或者從歷史記錄進(jìn)入才會(huì)相關(guān)數(shù)據(jù)才會(huì)存在。好的,我們?cè)賮?lái)看下localStorge表現(xiàn):

if (localStorage.pagecount){
    localStorage.pagecount=Number(localStorage.pagecount) +1;
}else{
    localStorage.pagecount=1;
 }
console.log("Visits "+ localStorage.pagecount + " time(s).");

控制臺(tái)首次輸入代碼:

關(guān)閉窗口,控制臺(tái)再次輸入代碼:

6. web Storage和cookie的區(qū)別

Web Storage(localStorage和sessionStorage)的概念和cookie相似,區(qū)別是它是為了更大容量存儲(chǔ)設(shè)計(jì)的。Cookie的大小是受限的,并且每次你請(qǐng)求一個(gè)新的頁(yè)面的時(shí)候Cookie都會(huì)被發(fā)送過(guò)去,這樣無(wú)形中浪費(fèi)了帶寬,另外cookie還需要指定作用域,不可以跨域調(diào)用。

除此之外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie需要前端開(kāi)發(fā)者自己封裝setCookie,getCookie。

但是Cookie也是不可以或缺的:Cookie的作用是與服務(wù)器進(jìn)行交互,作為HTTP規(guī)范的一部分而存在 ,而Web Storage僅僅是為了在本地“存儲(chǔ)”數(shù)據(jù)而生

后記

博主盡可能思路清晰的理了一遍cookie,session,localStorage,sessionStorage之間的區(qū)別和聯(lián)系,希望可以幫到大家。

參考文章:

cookie 和session 的區(qū)別詳解

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80913.html

相關(guān)文章

  • CDN小結(jié)

    摘要:二目的是一個(gè)經(jīng)策略性部署的整體系統(tǒng),從技術(shù)上全面解決由于網(wǎng)絡(luò)帶寬小用戶訪問(wèn)量大網(wǎng)點(diǎn)分布不均而產(chǎn)生的用戶訪問(wèn)網(wǎng)站響應(yīng)速度慢的根本原因。 一、CDN全稱:??Content Delivery Network或Content Ddistribute Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)。 ??二、目的:??CDN是一個(gè)經(jīng)策略性部署的整體系統(tǒng),從技術(shù)上全面解決由于網(wǎng)絡(luò)帶寬小、用戶訪問(wèn)量大、網(wǎng)點(diǎn)分布不...

    cod7ce 評(píng)論0 收藏0
  • 高性能javascript小結(jié)

    摘要:高性能小結(jié)文章轉(zhuǎn)載于我的博客最近看完了動(dòng)物叢書的高性能,覺(jué)得那本書的小結(jié)部分寫得非常不錯(cuò),簡(jiǎn)潔輕快易懂概括性很強(qiáng)。由于局部變量存在于作用域鏈的起始位置,因此訪問(wèn)局部變量比訪問(wèn)跨作用域變量更快。 高性能javascript小結(jié) 文章轉(zhuǎn)載于我的CSDN博客:http://blog.csdn.net/hello_world_20/article/details/46793317 最近看完了動(dòng)...

    wujl596 評(píng)論0 收藏0
  • JavaScript中常用的設(shè)計(jì)模式

    摘要:本文已同步到中常見(jiàn)的設(shè)計(jì)模式如果感覺(jué)寫的還可以,就給個(gè)小星星吧,歡迎和收藏。本文中關(guān)于各種設(shè)計(jì)模式定義都是引用書中的,部分引用自百度百科已標(biāo)出。下面把我整理出的常用設(shè)計(jì)模式按類型做個(gè)表格整理。 本文已同步到Github JavaScript中常見(jiàn)的設(shè)計(jì)模式,如果感覺(jué)寫的還可以,就給個(gè)小星星吧,歡迎star和收藏。 最近拜讀了曾探大神的《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》,真是醍醐...

    NSFish 評(píng)論0 收藏0
  • 分布式ID生成方案小結(jié)

    摘要:幾乎所有的系統(tǒng)都存在生成唯一的需求,如用戶賬單等,由于系統(tǒng)通常是分布式架構(gòu),因而需要有合適的分布式生成方案。優(yōu)勢(shì)和數(shù)據(jù)庫(kù)自增方案類似缺點(diǎn)同樣仍然有性能上限,依賴數(shù)據(jù)庫(kù)的可用性。使用時(shí),可以使用具體的場(chǎng)景選擇合適的方案。幾乎所有的系統(tǒng)都存在生成唯一ID的需求,如用戶ID、賬單ID等,由于系統(tǒng)通常是分布式架構(gòu),因而需要有合適的分布式ID生成方案。常見(jiàn)的分布式唯一ID方法有(歡迎補(bǔ)充):時(shí)間戳數(shù)據(jù)...

    Tecode 評(píng)論0 收藏0
  • 前端相關(guān)大雜燴

    摘要:希望幫助更多的前端愛(ài)好者學(xué)習(xí)。前端開(kāi)發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開(kāi)發(fā)工程師當(dāng)你問(wèn)起有關(guān)與時(shí),老司機(jī)們首先就會(huì)告訴你其實(shí)是個(gè)沒(méi)有網(wǎng)絡(luò)請(qǐng)求功能的庫(kù)。 前端基礎(chǔ)面試題(JS部分) 前端基礎(chǔ)面試題(JS部分) 學(xué)習(xí) React.js 比你想象的要簡(jiǎn)單 原文地址:Learning React.js is easier than you think 原文作...

    fuyi501 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<