Session和Cookie之間區別與聯繫

来源:http://www.cnblogs.com/ITCodeMonkey/archive/2017/11/21/7874343.html
-Advertisement-
Play Games

一. 概念理解 你可能有留意到當你瀏覽網頁時,會有一些推送消息,大多數是你最近留意過的同類東西,比如你想買桌子,上淘寶搜了一下,結果連著幾天會有各種各樣的桌子的鏈接。這是因為 你瀏覽某個網頁的時候,WEB 伺服器會先送一些資料放在你的電腦上,類似於你打的文字,選的一些東西什麼的,Cookie 會幫 ...


一. 概念理解

你可能有留意到當你瀏覽網頁時,會有一些推送消息,大多數是你最近留意過的同類東西,比如你想買桌子,上淘寶搜了一下,結果連著幾天會有各種各樣的桌子的鏈接。這是因為

你瀏覽某個網頁的時候,WEB 伺服器會先送一些資料放在你的電腦上,類似於你打的文字,選的一些東西什麼的,Cookie 會幫你都紀錄下來。當下次你再光臨同一個網站,WEB

伺服器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie里的內容來判斷使用者,送出特定的網頁內容給你。 Cookie 的使用很普遍,許多有提供個人化服務的

網站,都是利用 Cookie來辨認使用者,以方便送出使用者量身定做的內容。

然而,cookie是什麼呢?session又是什麼?

先來瞭解幾個概念。

  1、無狀態的HTTP協議:

協議是指電腦通信網路中兩台電腦之間進行通信所必須共同遵守的規定或規則,超文本傳輸協議(HTTP)是一種通信協議,它允許將超文本標記語言(HTML)文檔從Web伺服器

傳送到客戶端的瀏覽器。

HTTP協議是無狀態的協議。一旦數據交換完畢,客戶端與伺服器端的連接就會關閉,再次交換數據需要建立新的連接。這就意味著伺服器無法從連接上跟蹤會話

  2、會話(Session)跟蹤:

  會話,指用戶登錄網站後的一系列動作,比如瀏覽商品添加到購物車併購買。會話(Session)跟蹤是Web程式中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術

     是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份Session通過在伺服器端記錄信息確定用戶身份

二. Cookie

  由於HTTP是一種無狀態的協議,伺服器單從網路連接上無從知道客戶身份。用戶A購買了一件商品放入購物車內,當再次購買商品時伺服器已經無法判斷該購買行為是屬於用戶A的

  會話還是用戶B的會話了。怎麼辦呢?就給客戶端們頒發一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣伺服器就能從通行證上確認客戶身份了。這就是Cookie

  的工作原理。

  Cookie實際上是一小段的文本信息。客戶端請求伺服器,如果伺服器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端會把Cookie保存起來。

  當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給伺服器。伺服器檢查該Cookie,以此來辨認用戶狀態。伺服器還可以根據需要修改Cookie的內容。

  1、cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用範圍。

1)Name 和 Value 屬性由程式設定,預設值都是空引用。

2)Domain屬性的預設值為當前URL的功能變數名稱部分,不管發出這個cookie的頁面在哪個目錄下的。

3)Path屬性的預設值是根目錄,即 ”/” ,不管發出這個cookie的頁面在哪個目錄下的。可以由程式設置為一定的路徑來進一步限制此cookie的作用範圍。

4)Expires 屬性,這個屬性設置此Cookie 的過期日期和時間。

1 HttpCookie cookie = new HttpCookie("MyCook");//初使化並設置Cookie的名稱
2 DateTime dt = DateTime.Now;
3 TimeSpan ts = new TimeSpan(0, 0, 1, 0, 0);//過期時間為1分鐘
4 cookie.Expires = dt.Add(ts);//設置過期時間
5 cookie.Values.Add("userid", "value");
6 cookie.Values.Add("userid2", "value2");
7 Response.AppendCookie(cookie);

2、Path和Domain屬性

--path:  

   如果http://www.china.com/test/index.html 建立了一個cookie,那麼在http://www.china.com/test/目錄里的所有頁面,以及該目錄下麵任何子目錄

   的頁面都可以訪問這個cookie。這就是說,在http://www.china.com/test/test2/test3 里的任何頁面都可以訪問http://www.china.com/test/index.html

   建立的cookie。但是,如果http://www.china.com/test/ 需要訪問http://www.china.com/test/index.html設置的cookes,該怎麼辦?

   這時,我們要把cookies的path屬性設置成“/”。在指定路徑的時候,凡是來自同一伺服器,URL里有相同路徑的所有WEB頁面都可以共用cookies。

--Domain:

   比如: http://www.baidu.com/xxx/login.aspx 頁面中發出一個cookie,Domain屬性預設就是www.baidu.com ,可以由程式設置此屬性為需要的值。  

   值是功能變數名稱,比如www.china.com。這是對path路徑屬性的一個延伸。如果我們想讓 www.china.com能夠訪問bbs.china.com設置的cookies,該怎麼辦? 我們可以把

   domain屬性設置成“china.com”, 並把path屬性設置成“/”。

  3、會話Cookie和持久Cookie

若不設置過期時間,則表示這個cookie的生命期為瀏覽器會話期間,關閉瀏覽器視窗,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不存儲在

硬碟上而是保存在記憶體里,當然這種行為並不是規範規定的。

若設置了過期時間,瀏覽器就會把cookie保存到硬碟上,關閉後再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬碟上的cookie可以在瀏覽器的不同進程間共用。

這種稱為持久Cookie。 

  4、Cookie具有不可跨功能變數名稱性

就是說,瀏覽器訪問百度不會帶上谷歌的cookie。

三. Session

  Session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端瀏覽器中,而Session保存在伺服器上。客戶端瀏覽器訪問伺服器的時候,伺服器把客戶端信息以某種形式記錄

  在伺服器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。

  每個用戶訪問伺服器都會建立一個session,那伺服器是怎麼標識用戶的唯一身份呢?事實上,用戶與伺服器建立連接的同時,伺服器會自動為其分配一個SessionId。

  1、兩個問題:

1)什麼東西可以讓你每次請求都把SessionId自動帶到伺服器呢?顯然就是cookie了,如果你想為用戶建立一次會話,可以在用戶授權成功時給他一個唯一的cookie。當一個

用戶提交了表單時,瀏覽器會將用戶的SessionId自動附加在HTTP頭信息中,(這是瀏覽器的自動功能,用戶不會察覺到),當伺服器處理完這個表單後,將結果返回給SessionId

所對應的用戶。試想,如果沒有 SessionId,當有兩個用戶同時進行註冊時,伺服器怎樣才能知道到底是哪個用戶提交了哪個表單呢。

2)儲存需要的信息。伺服器通過SessionId作為key,讀寫到對應的value,這就達到了保持會話信息的目的。

  2、session的創建:

當程式需要為某個客戶端的請求創建一個session時,伺服器首先檢查這個客戶端的請求里是否已包含了sessionId,如果已包含則說明以前已經為此客戶端創建過session,服務

器就按照sessionId把這個session檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含sessionId,則為此客戶端創建一個session並且生成一個與此session相關

聯的sessionId,sessionId的值是一個既不會重覆,又不容易被找到規律以仿造的字元串,這個sessionId將被在本次響應中返回給客戶端保存。

  3、禁用cookie:

  如果客戶端禁用了cookie,通常有兩種方法實現session而不依賴cookie。

1)URL重寫,就是把sessionId直接附加在URL路徑的後面。

2)表單隱藏欄位。就是伺服器會自動修改表單,添加一個隱藏欄位,以便在表單提交時能夠把session id傳遞迴伺服器。比如: 

<form name="testform" action="/xxx"> 
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 
<input type="text"> 
</form> 

  4、Session共用:

對於多網站(同一父域不同子域)單伺服器,我們需要解決的就是來自不同網站之間SessionId的共用。由於功能變數名稱不同(aaa.test.com和bbb.test.com),而SessionId又分別儲存

在各自的cookie中,因此伺服器會認為對於兩個子站的訪問,是來自不同的會話。解決的方法是通過修改cookies的功能變數名稱為父功能變數名稱達到cookie共用的目的,從而實現SessionId的共

享。帶來的弊端就是,子站間的cookie信息也同時被共用了。  

四. 總結

1、cookie數據存放在客戶的瀏覽器上,session數據放在伺服器上。

2、cookie不是很安全,別人可以分析存放在本地的cookie併進行cookie欺騙,考慮到安全應當使用session。

3、session會在一定時間內保存在伺服器上。當訪問增多,會比較占用你伺服器的性能,考慮到減輕伺服器性能方面,應當使用cookie。

4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

5、可以考慮將登陸信息等重要信息存放為session,其他信息如果需要保留,可以放在cookie中。


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

-Advertisement-
Play Games
更多相關文章
  • 1. CentOS6及以前 在CentOS6及以前的版本中,free命令輸出是這樣的: 第一行: 系統記憶體主要分為四部分:used(程式已使用記憶體),free(空閑記憶體),buffers(buffer cache),cached(Page cache)。 系統總記憶體total = used + fr ...
  • 紙殼CMS發佈了2.3版本,主要是添加了商城功能,強化產品功能。讓您的網站輕鬆實現電子商務。 有關2.3版本的更多信息,請查看以下鏈接: https://github.com/SeriaWei/ZKEACMS.Core/releases/tag/v2.3 ...
  • 返回總目錄 本小節目錄 Move Method(搬移函數) Move Field(搬移欄位) 1Move Method(搬移函數) 概要 你的程式中,有個函數與其所駐類之外的另一個類進行更多交流:調用後者,或被或者調用。 在該函數最常引用的類中建立一個有著類似行為的新函數。將舊函數變成一個單純的委托 ...
  • 在上一章中,詳細介紹了 ASP.NET Core 中的授權策略,在需要授權時,只需要在對應的Controler或者Action上面打上 特性,並指定要執行的策略名稱即可,但是,授權策略是怎麼執行的呢?懷著一顆好奇的心,忍不住來探索一下它的執行流程。 目錄 1. "MVC中的授權" "Authoriz ...
  • static bool CheckPowerOfTwo(ulong num) { return num > 0 && (num & (num - 1)) == 0; } ...
  • 引自https://www.cnblogs.com/lsgsanxiao/p/5523282.html invoke和begininvoke 區別 一直對invoke和begininvoke的使用和概念比較混亂,這兩天看了些資料,對這兩個的用法和原理有了些新的認識和理解。 首先說下,invoke和b ...
  • 如何:對 Windows 窗體控制項進行線程安全調用 訪問 Windows 窗體控制項本質上不是線程安全的。 如果有兩個或多個線程操作某一控制項的狀態,則可能會迫使該控制項進入一種不一致的狀態。 還可能會出現其他與線程相關的 Bug,例如爭用情況和死鎖。 確保以線程安全方式訪問控制項非常重要。 在未使用 In ...
  • 一 前言 對於正則表達式,相信很多人都知道,但是很多人的第一感覺就是難學,因為看第一眼時,覺得完全沒有規律可尋,而且全是一堆各種各樣的特殊符號,完全不知所云。 其實只是對正則不瞭解而以,瞭解了你就會發現,原來就這樣啊正則所用的相關字元其實不多,也不難記,更不難懂,唯一難的就是組合起來之後,可讀性比較 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...