JavaScript 操作 Cookie

從事web開發也有些日子了,cookie 是個啥差不多能說明白,可是實際自己一上手操作就是得去搜索(你們懂的),結果被鄙視了...所以就寫一篇博文做為自己的學習筆記,嘿嘿,博客的好處在此體現出來了。

?

  什么是 Cookie

  “cookie 是存儲于訪問者的計算機中的變量。每當同一臺計算機通過瀏覽器請求某個頁面時,就會發送這個 cookie。你可以使用 JavaScript 來創建和取回 cookie 的值。” -?w3school
  cookie 是訪問過的網站創建的文件,用于存儲瀏覽信息,例如個人資料信息。

  從JavaScript的角度看,cookie 就是一些字符串信息。這些信息存放在客戶端的計算機中,用于客戶端計算機與服務器之間傳遞信息。

  在JavaScript中可以通過 document.cookie 來讀取或設置這些信息。由于 cookie 多用在客戶端和服務端之間進行通信,所以除了JavaScript以外,服務端的語言(如PHP)也可以存取 cookie。

?

  Cookie 基礎知識

  • cookie 是有大小限制的,每個 cookie 所存放的數據不能超過4kb,如果 cookie 字符串的長度超過4kb,則該屬性將返回空字符串。
  • 由于 cookie 最終都是以文件形式存放在客戶端計算機中,所以查看和修改 cookie 都是很方便的,這就是為什么常說 cookie 不能存放重要信息的原因。
  • 每個 cookie 的格式都是這樣的:<cookie名>=<值>;名稱和值都必須是合法的標示符。
  • cookie 是存在 有效期的。在默認情況下,一個 cookie 的生命周期就是在瀏覽器關閉的時候結束。如果想要 cookie 能在瀏覽器關掉之后還可以使用,就必須要為該 cookie 設置有效期,也就是 cookie 的失效日期。
  • alert(typeof document.cookie)  結果是?string,曾經我以為是array,還鬧過笑話...囧
  • cookie 有域和路徑這個概念。域就是domain的概念,因為瀏覽器是個注意安全的環境,所以不同的域之間是不能互相訪問 cookie 的(當然可以通過特殊設置的達到 cookie 跨域訪問)。路徑就是routing的概念,一個網頁所創建的 cookie 只能被與這個網頁在同一目錄或子目錄下得所有網頁訪問,而不能被其他目錄下得網頁訪問(這句話有點繞,一會看個例子就好理解了)。
  • 其實創建cookie的方式和定義變量的方式有些相似,都需要使用 cookie 名稱和 cookie 值。同個網站可以創建多個 cookie ,而多個 cookie 可以存放在同一個cookie 文件中。
  Cookie常見問題
  • cookie 存在兩種類型:
    • 你瀏覽的當前網站本身設置的 cookie
    • 來自在網頁上嵌入廣告或圖片等其他域來源的?第三方 cookie (網站可通過使用這些 cookie 跟蹤你的使用信息)
  • 剛剛基礎知識里面有說到 cookie 生命周期的問題,其實 cookie 大致可分為兩種狀態:
    • 臨時性質的cookie。當前使用的過程中網站會儲存一些你的個人信息,當瀏覽器關閉后這些信息也會從計算機中刪除
    • 設置失效時間的cookie。就算瀏覽器關閉了,這些信息業依然會在計算機中。如?登錄名稱和密碼,這樣無須在每次到特定站點時都進行登錄。這種cookie 可在計算機中保留幾天、幾個月甚至幾年
  • cookie 有兩種清除方式:
    • 通過瀏覽器工具清除 cookie (有第三方的工具,瀏覽器自身也有這種功能)
    • 通過設置 cookie 的有效期來清除 cookie
    • 注:刪除 cookie 有時可能導致某些網頁無法正常運行
  • 瀏覽器可以通過設置來接受和拒絕訪問 cookie。
  • 出于功能和性能的原因考慮,建議盡量降低 cookie 的使用數量,并且要盡量使用小 cookie。
  • 關于cookie編碼的細節問題將會在cookie高級篇中單獨介紹。
  • 假如是本地磁盤中的頁面,chrome的控制臺是無法用JavaScript讀寫操作 cookie 的,解決辦法...換一個瀏覽器^_^。

  Cookie基礎用法

  一.簡單的存取操作

  在使用JavaScript存取 cookie 時,必須要使用Document對象的 cookie 屬性;一行代碼介紹如何創建和修改一個 cookie :

  document.cookie  = 'username=Darren'

  以上代碼中'username'表示 cookie 名稱,'Darren'表示這個名稱對應的值。假設 cookie 名稱并不存在,那么就是創建一個新的 cookie;如果存在就是修改了這個 cookie 名稱對應的值。如果要多次創建 cookie ,重復使用這個方法即可。

?

  二.cookie的讀取操作

  要精確的對 cookie 進行讀取其實很簡單,就是對字符串進行操作。從w3school上copy這段代碼來做分析:

function getCookie(c_name){if (document.cookie.length>0){  //先查詢cookie是否為空,為空就return ""c_start=document.cookie.indexOf(c_name + "=")  //通過String對象的indexOf()來檢查這個cookie是否存在,不存在就為 -1  if (c_start!=-1){ c_start=c_start + c_name.length+1  //最后這個+1其實就是表示"="號啦,這樣就獲取到了cookie值的開始位置c_end=document.cookie.indexOf(";",c_start)  //其實我剛看見indexOf()第二個參數的時候猛然有點暈,后來想起來表示指定的開始索引的位置...這句是為了得到值的結束位置。因為需要考慮是否是最后一項,所以通過";"號是否存在來判斷if (c_end==-1) c_end=document.cookie.length  return unescape(document.cookie.substring(c_start,c_end))  //通過substring()得到了值。想了解unescape()得先知道escape()是做什么的,都是很重要的基礎,想了解的可以搜索下,在文章結尾處也會進行講解cookie編碼細節} }return ""} 


  當然想實現讀取cookie的方法還有不少,比如數組,正則等,這里就不往細說了。

?

  三.設置cookie的有效期

  文章中常常出現的 cookie 的生命周期也就是有效期和失效期,即 cookie 的存在時間。在默認的情況下,cookie 會在瀏覽器關閉的時候自動清除,但是我們可以通過expires來設置 cookie 的有效期。語法如下:

  document.cookie = "name=value;expires=date"

  上面代碼中的date值為GMT(格林威治時間)格式的日期型字符串,生成方式如下:

  var _date = new Date();_date.setDate(_date.getDate()+30);_date.toGMTString();

  上面三行代碼分解為幾步來看:

  • 通過new生成一個Date的實例,得到當前的時間;
  • getDate()方法得到當前本地月份中的某一天,接著加上30就是我希望這個cookie能過在本地保存30天;
  • 接著通過setDate()方法來設置時間;
  • 最后 用toGMTString()方法把Date對象轉換為字符串,并返回結果

  通過下面這個完整的函數來說明在創建 cookie 的過程中我們需要注意的地方 - 從w3school復制下來的。創建一個在 cookie 中存儲信息的函數:

function setCookie(c_name, value, expiredays){
2     var exdate=new Date();
3     exdate.setDate(exdate.getDate() + expiredays);
4     document.cookie=c_name+ "=" + escape(value) + ((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
5   }
6   //使用方法:setCookie('username','Darren',30)  


  現在我們這個函數是按照天數來設置cookie的有效時間,如果想以其他單位(如:小時)來設置,那么改變第三行代碼即可:

  exdate.setHours(exdate.getHours() + expiredays);

  這樣設置以后的cookie有效期就是按照小時為單位的。

  常見問題中有提到清除?cookie 的兩種方法,現在要說的是使 cookie 失效,通過把有效期的時間設置為一個已過期的時間。既然已經有了設置有效期的方法,那么設置失效期的方法就請感興趣的朋友自己動手了^_^。下面繼續比較深的cookie話題。

?

  Cookie 高級篇

  一.cookie 路徑概念

  在基礎知識中有提到 cookie 有域和路徑的概念,現在來介紹路徑在 cookie 中的作用。

  cookie 一般都是由于用戶訪問頁面而被創建的,可是并不是只有在創建 cookie 的頁面才可以訪問這個 cookie。

  默認情況下,只有與創建 cookie 的頁面在同一個目錄或子目錄下的網頁才可以訪問,這個是因為安全方面的考慮,造成不是所有頁面都可以隨意訪問其他頁面創建的 cookie。舉個例子:

  在 "http://www.cnblogs.com/Darren_code/" 這個頁面創建一個cookie,那么在"/Darren_code/"這個路徑下的頁面如: "http://www.cnblogs.com/Darren_code/archive/2011/11/07/Cookie.html"這個頁面默認就能取到cookie信息。

  可在默認情況下, "http://www.cnblogs.com"或者 "http://www.cnblogs.com/xxxx/" 就不可以訪問這個 cookie(光看沒用,實踐出真理^_^)。

  那么如何讓這個 cookie 能被其他目錄或者父級的目錄訪問類,通過設置 cookie 的路徑就可以實現。例子如下:

  document.cookie = "name=value;path=path"document.cookie = "name=value;expires=date;path=path"

?  紅色字體path就是 cookie 的路徑,最常用的例子就是讓 cookie 在跟目錄下,這樣不管是哪個子頁面創建的 cookie,所有的頁面都可以訪問到了:

  document.cookie = "name=Darren;path=/"

  ?

  二.cookie 域概念

  路徑能解決在同一個域下訪問 cookie 的問題,咱們接著說 cookie 實現同域之間訪問的問題。語法如下:

  document.cookie = "name=value;path=path;domain=domain"

  紅色的domain就是設置的 cookie 域的值。

  例如?"www.qq.com" 與 "sports.qq.com" 公用一個關聯的域名"qq.com",我們如果想讓 "sports.qq.com" 下的cookie被?"www.qq.com" 訪問,我們就需要用到 cookie 的domain屬性,并且需要把path屬性設置為 "/"。例:

  document.cookie = "username=Darren;path=/;domain=qq.com"

  注:一定的是同域之間的訪問,不能把domain的值設置成非主域的域名。

?

  三.cookie 安全性

  通常 cookie 信息都是使用HTTP連接傳遞數據,這種傳遞方式很容易被查看,所以 cookie 存儲的信息容易被竊取。假如 cookie 中所傳遞的內容比較重要,那么就要求使用加密的數據傳輸。

  所以 cookie 的這個屬性的名稱是“secure”,默認的值為空。如果一個 cookie 的屬性為secure,那么它與服務器之間就通過HTTPS或者其它安全協議傳遞數據。語法如下:

  document.cookie = "username=Darren;secure"

  把cookie設置為secure,只保證 cookie 與服務器之間的數據傳輸過程加密,而保存在本地的 cookie文件并不加密。如果想讓本地cookie也加密,得自己加密數據。

  注:就算設置了secure 屬性也并不代表他人不能看到你機器本地保存的 cookie 信息,所以說到底,別把重要信息放cookie就對了,囧...

  ?

  四.cookie 編碼細節

  原本來想在常見問題那段介紹cookie編碼的知識,因為如果對這個不了解的話編碼問題確實是一個坑,所以還是詳細說說。

  在輸入cookie信息時不能包含空格,分號,逗號等特殊符號,而在一般情況下,cookie 信息的存儲都是采用未編碼的方式。所以,在設置 cookie 信息以前要先使用escape()函數將 cookie 值信息進行編碼,在獲取到 cookie 值得時候再使用unescape()函數把值進行轉換回來。如設置cookie時:

  document.cookie = name + "="+ escape (value)

  再看看基礎用法時提到過的getCookie()內的一句:

  return unescape(document.cookie.substring(c_start,c_end))

  這樣就不用擔心因為在cookie值中出現了特殊符號而導致 cookie 信息出錯了。

?

  總結

  在工作中越來越感覺到基礎的重要性了,有很多技術細節都是要懂不懂或者的懂的不多。為了改善這種情況,打算以后會對知識的細節從點到面的去理解,然后再寫博客加深印象,也能分享給更多有需要的朋友。

  今天是感恩節,感謝所有人...

?

  如果覺得這文章還算用心,請勞駕點擊右下角的推薦,這是對我們這些做分享的最大的肯定,謝謝。

作者:聶微東
出處:http://www.cnblogs.com/Darren_code/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276591.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

阿里云服務器購買該如何選擇?阿里云服務器購買步驟流程介紹...

很多第一次購買阿里云服務器&#xff0c;不知該如何選擇適合自已的服務器。其實購買阿里云服務器&#xff0c;主要是根據自已網站的流量來決定的。如果網站流量不大&#xff0c;一天只有幾百ip&#xff0c;一般選擇1核cpu&#xff0c;1G內存&#xff0c;1MB帶寬就可以用了&…

python 切片_全面解讀Python高級特性切片

大家好&#xff0c;歡迎來到Crossin的編程教室&#xff01;眾所周知&#xff0c;我們可以通過索引值(或稱下標)來查找序列類型(如字符串、列表、元組…)中的單個元素&#xff0c;那么&#xff0c;如果要獲取一個索引區間的元素該怎么辦呢&#xff1f;切片(slice)就是一種截取索…

十大Web網站漏洞掃描工具

原文鏈接&#xff1a;http://zhumeng8337797.blog.163.com/blog/static/1007689142012819111054920/ 1. Nikto 這是一個開源的Web服務器掃描程序&#xff0c;它可以對Web服務器的多種項目(包括3500個潛在的危險文件/CGI&#xff0c;以及超過900個服務器版本&#xff0c;還有250…

讀書筆記(06) - 語法基礎 - JavaScript高級程序設計

寫在開頭 本篇是小紅書筆記的第六篇&#xff0c;也許你會奇怪第六篇筆記才寫語法基礎&#xff0c;筆者是不是穿越了。 答案當然是沒有&#xff0c;筆者在此分享自己的閱讀心得&#xff0c;不少人翻書都是從頭開始&#xff0c;結果永遠就只在前幾章。對此&#xff0c;筆者換了隨…

最近做了一個安裝包的安裝流程圖

最近到做安裝包的詳細設計。下圖是安裝包的流程圖&#xff0c;如果有什么意見和建議&#xff0c;希望大家給我留言&#xff0c;大家以前討論 轉載于:https://www.cnblogs.com/zengshengping815/archive/2009/04/22/1441319.html

如何使用Nikto漏洞掃描工具檢測網站安全

轉載鏈接&#xff1a;http://www.linuxidc.com/Linux/2011-02/32000.htm 【51CTO.com 獨家特稿】隨著信息技術的發展&#xff0c;網絡應用越來越廣泛&#xff0c;很多企業單位都依靠網站來運營&#xff0c;正因為業務的不斷提升和應用&#xff0c;致使網站的安全性顯得越來越重…

什么是區塊鏈預言機(BlockChain Oracle)

預言機 Oracle 是區塊鏈中非常重要的一個功能&#xff0c;但我發現很少有人討論&#xff0c;也可能很多人對此并不了解。而網上關于預言機的文章很少&#xff0c;很多也沒有講明白&#xff0c;甚至有些還是錯誤的。所以我整理了一篇詳細的文章&#xff0c;分享給大家&#xff0…

idea tomcat啟動成功但是訪問方面都是404_IDEA相關配置【集成Tomcatamp;項目部署】...

“知其然知其所以然”始終是Brick我學習新興技術的出發點&#xff0c;那么咱們來聊聊以下幾個問題問題1&#xff1a;在編寫完web項目之后&#xff0c;我們怎么才能運行項目呢&#xff1f;--需要部署項目到Tomcat上。問題2&#xff1a;部署項目到Tomcat服務器有多少種方式&#…

程序員素質面試題

技術題做完后&#xff0c;先檢查技術是否合格&#xff0c;技術合格的并非就一定是合適人選&#xff0c;還要做素質面試。 如下是小y出的面試題&#xff1a; &#xff08;上進心&#xff09;1.你的職業規劃是怎樣的&#xff0c;未來兩年想朝哪個方向發展&#xff1f; &#xff0…

用U盤或移動硬盤安裝Windows7 (超簡單制作Win7安裝U盤方法)

轉載鏈接&#xff1a;http://www.iplaysoft.com/win7-usb-dvd-download-tool.html 最近很多人想要安裝 Windows7 &#xff0c;下載回去后的ISO鏡像文件很多人都是使用 Nero 或 IMGBurn 等工具刻錄成光盤來安裝的。但實際上&#xff0c;不需刻盤安裝Win7的方法還是有不少的。…

安裝pywin32時:ImportError: DLL load failed: %1 不是有效的 Win32 應用程序和 DLL load failed...

問題一&#xff1a;ImportError: DLL load failed: %1 不是有效的 Win32 應用程序 import pywinapi報錯:ImportError: DLL load failed: %1 不是有效的 Win32 應用程序 原因&#xff1a;與python版本不對應 pypi官網上下載whl文件,我的python 版本為27 下載第一個后安裝 下載文…

pointcut注解_Spring AOP使用指南,詳細了解AOP相關注解

Spring AOP 指導教程什么是Spring AOP spring aop可以在spring構建的系統中使用面向切面編程。當然Spring Boot也是基于Spring構建的。使用AOP可以實現諸如事務&#xff0c;日志以及安全校驗等通過切面統一完成的任務。他可以通過簡單的注解方式實現在方法執行前后來執行你自己…

C# 實現FTP上傳與下載

向FTP服務器下載文件的簡單實例 Codestring filePath "d:\\"; string fileName "lhking.txt"; //文件下載之后要保存的路徑和文件名 FtpWebRequest reqFTP; try { FileStream outputStream …

Linux源碼安裝mysql 5.6.12(cmake編譯)

轉載鏈接&#xff1a;http://www.2cto.com/database/201307/229260.html Linux源碼安裝mysql 5.6.12&#xff08;cmake編譯&#xff09;1.安裝make編譯器(默認系統自帶)下載地址&#xff1a;http://www.gnu.org/software/make/[c-sharp] tar zxvf make-3.82.tar.gz cd make-3.…

云棲專輯 | 阿里開發者們的第6個感悟:享受折磨

2015年12月20日&#xff0c;云棲社區上線。2018年12月20日&#xff0c;云棲社區3歲。阿里巴巴常說“晴天修屋頂”。在我們看來&#xff0c;寒冬中&#xff0c;最值得投資的是學習&#xff0c;是增厚的知識儲備。所以社區特別制作了這個專輯——分享給開發者們20個彌足珍貴的成長…

python刪除數據庫的數據完整代碼_利用python操作小程序云數據庫實現簡單的增刪改查...

不止python&#xff0c;你可以利用任何語言那實現通過http請求來操作你自己的小程序云數據庫了背景也是在最近吧&#xff0c;小程序更新了云開發 HTTP API 文檔&#xff0c;提供了小程序外訪問云開發資源的能力&#xff0c;使用 HTTP API 開發者可在已有服務器上訪問云資源&…

AI技術在智能海報設計中的應用

背景 在視覺設計領域中&#xff0c;設計師們往往會因為一些簡單需求付出相當多的時間&#xff0c;比如修改文案內容&#xff0c;設計簡單的海報版式&#xff0c;針對不同機型、展位的多尺寸拓展等。這些工作需要耗費大量的時間、人力成本&#xff08;5~6張/人日&#xff09;&am…

javaScript如何監聽瀏覽器關閉事件

轉載鏈接&#xff1a;http://www.cnblogs.com/Tim_Liu/archive/2010/11/09/1872596.html 最近寫東西的時候發現需要對瀏覽器的關閉進行監聽,當用戶關閉的時候需要調用session.invalid();清空session信息,但是仔細一查手冊發現無論是body還是window都沒有onclose事件,之后onload…

C++樹的實現

C樹的實現 STL里面沒有提供容器樹的模板實現&#xff0c;自已寫一個&#xff1a;Tree.h //tree.h 頭文件 #include <list> #include <algorithm> using namespace std; struct TreeNode; //定義一個結構體原型 classTree; //定義一個類原型 classIterator; //定義一…

加密文件忘記密碼怎么解密_MyBatis 配置文件 用戶密碼加密存儲

properties配置文件一般是使用properties保存配置文件內容,然后在mybatis配置文件中進行讀取在resource文件下新建db.properties文件內容如下# 數據庫配置文件 driver com.mysql.cj.jdbc.Driver url jdbc:mysql:// /mybatis username password 然后,接著把文件放入源碼包…