淺談Cookie、Session與Cache的區別

来源:https://www.cnblogs.com/supersnowyao/archive/2018/03/11/8544747.html
-Advertisement-
Play Games

以前實現數據的緩存有多種方法,如客戶端的Cookie,伺服器端的Session、Application。 一、Cookie Cookie是保存客戶端的一組數據,主要用來保存用戶的個人信息,主要存放瀏覽器請求伺服器時的請求信息,這些信息是非敏感信息。主要用於當用戶訪問您的系統時,應用程式可以檢索以前存 ...


     以前實現數據的緩存有多種方法,如客戶端的Cookie,伺服器端的Session、Application。

     一、Cookie

     Cookie是保存客戶端的一組數據,主要用來保存用戶的個人信息,主要存放瀏覽器請求伺服器時的請求信息,這些信息是非敏感信息。主要用於當用戶訪問您的系統時,應用程式可以檢索以前存儲的信息。

     1、保存時間可以根據需要進行設置:

          1)如果沒有設置Cookie失效日期,它的生命周期保存到關閉瀏覽器為止;

          2)若Cookie對象的Expires屬性設置為MinValue,表示永不過期;

     2、Cookie存儲的數據量受限制,大多數的瀏覽器約束為4KB左右,所以不要存放太大數據。

     3、Cookie的關鍵特性:

          1)存儲在客戶端的磁碟上;

          2)是與用戶相關的數據;

          3)在一定的時間內持久化存儲;

          4)可以跨瀏覽器共用數據;

          5)數據需要被序列化;

          6)會發生客戶端與伺服器端數據傳輸;

          7)用戶相關;

     二、Session

     Session是由應用伺服器維持的一個伺服器端的存儲空間,是一種保存上下文信息的機制,它是針對每一個用戶的。用戶在連接伺服器時,伺服器會生成一個唯一的SessionID,用該SessionID為標識符來存取伺服器端的Session存儲空間,面SessionID這一數據是以Cookie形式保存在客戶端。用戶提交頁面時,會將SessionID提交到伺服器端,來存取Session數據。這一過程是不用開發人員來干預的,所以一旦客戶端禁用Cookie,Session理論上也會失效,但伺服器也可以自動通過URL重寫的方式來傳遞SessionID的值,因此也不是完全依賴Cookie,並且這個過程對於開發人員是透明的。

     所以,即使不寫Cookie,在使用Request.GetCookies()方法取出的Cookie數組長度也是1,而這個Cookie的名字就是JSessionID,還有一個很長的二進位字元串,這就是SessionID的值。

     備註:

     為什麼會有Cookie呢,大家都知道,Http是無狀態的協議,客戶每次讀取web頁面時,伺服器都打開新的會話,而且伺服器也不會自動維護客戶的上下文信息,那麼要怎麼才能實現網上商店中的購物車呢,Session就是一種保存上下文信息的機制,它是針對每一個用戶的,將變數的值保存在伺服器端,通過SessionID來區分不同的客戶,Session是以Cookie或URL重寫為基礎的,預設使用Cookie來實現,系統會創造一個名為JSessionID的輸出Cookie,我們叫做Session-Cookie,以區別Persistent-Cookie,也就是我們通常所說的客戶端Cookie,註意Session-Cookie是存儲於瀏覽器記憶體中的,並不是寫到硬碟上的,這也就是我們剛纔看到的JSessionID,我們通常情是看不到JSessionID的,但是當我們把瀏覽器的Cookie禁止後,Web伺服器會採用URL重寫的方式傳遞SessionID,我們就可以在地址欄看到SessionID=KWJHUG6JJM65HS2K6之類的字元串。

     明白了原理,我們就可以很容易的分辨出Persistent-CookieSession-Cookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,Session-Cookie針對某一次會話而言,會話結束Session-Cookie也就隨著消失了,而Persistent-Cookie只是存在於客戶端硬碟上的一段文本(通常是加密的),而且可能會遭到Cookie欺騙以及針對Cookie的跨站腳本攻擊,自然不如Session-Cookie安全了。

     通常Session-Cookie是不能跨視窗使用的,當你新開了一個瀏覽器視窗進入相同頁面時,系統會賦予你一個新的SessionID,這樣我們信息共用的目的就達不到了,此時我們可以先把SessionID保存在Persistent-Cookie中,然後在新視窗中讀出來,就可以得到上一個視窗SessionID了,這樣通過Session-CookiePersistent-Cookie的結合我們就實現了跨視窗的Session-Tracking(會話跟蹤)。

     在一些Web開發的書中,往往只是簡單的把Session和Cookie作為兩種併列的Http傳送信息的方式,Session-Cookie位於伺服器端,Persistent-Cookie位於客戶端,可是Session又是以Cookie為基礎的。

     Session的關鍵特性:

          1)Session用來保存每一個用戶的專有信息;

          2)Session的生存期是用戶持續請求時間加生存時間;

          3)Session信息是保存在應用伺服器記憶體中,保存數據量可大可小;

          4)用戶停止使用應用程式之後,Session仍在記憶體中停留一段時間,因此這種方法效率較低;

          5)相較與在資料庫中存儲和檢索信息相比,它的執行速度會更快;

          6)Session應用於單個用戶以其相應會話狀態。因此,適合存儲隨用戶的變化而變化的常用數據,或存儲關於用戶的安全數據;

          7)Session不會發生客戶端與伺服器端數據傳輸;

          8)會話相關;

          9)在會話的整個生存期中,不會被主動丟棄;

          10)數據不被序列化;

     三、Cache

     Cache存儲於伺服器的記憶體中,允許您自定義如何緩存數據項,以及緩存多長時間。當系統缺乏記憶體時,緩存會自動移除很少使用的或優先順序較低的緩存項,以釋放記憶體,此過程稱為清理。這是緩存為了確保過期數據不再占用寶貴的伺服器資源的方式之一。它不與會話相關,所以它是多會話共用的,因此緩存可以提高系統性能。同時有可能會泄露用戶信息,另外在獲取數據時還需要檢測該緩存項是否還存在。

     Cache的關鍵特性:

          1)Cache用於在Http請求期間保存頁面或者數據;

          2)Cache的使用可以大大提高整個系統的效率;

          3)由於Cache的使用是將頻繁訪問的數據放在記憶體中,當用戶發出相同的請求後,伺服器不會再次處理,而是直接緩存結果返回給用戶。所以,Cache節省的是伺服器處理時間

          4)對於緩存與應用程式在一起的情況,當應用程式重啟將重新創建其實例;

          5)與會話無關

          6)根據伺服器資源的狀況,緩存項隨時可能被丟棄;

          7)數據不被序列化;

          8)Cache不會發生客戶端與伺服器端數據傳輸;

     四、總結

     1、由於Session依賴於客戶端Cookie(SessionID是存放於Cookie中的),因此不支持Cookie的瀏覽器,Session也會丟失,當然可以用Session Url重寫來解決此問題。

     2、Cookie不建議存放大數據量(如存一個表格數據等),因為Cookie的值在每次Web頁面請求往返的過程中都是要附在Http頭中的,如果太大會占用客戶端與伺服器端之間的帶寬,如果多個連接訪問就是N*4KB,當用戶多了,就會成為瓶頸之一。

     3、Cache也要占用伺服器的記憶體,但是比Session要多一些靈活性,但要註意哪些數據需要緩存,哪些本就不需要緩存。

     4、針對用Cache替換Session,對於單一系統來說,是完全不需要註意什麼的。若是針對單點登錄來說,同一賬號可以訪問幾個系統。或者在同一電腦中在不同的頁面中訪問不同的系統,那在做Cache數據保存時,應該根據不同的系統唯一標識來保存針對不同系統數據的緩存,以達SessionID的作用(當然還有其他實現方案)。否則,對於前面登錄的系統,在Cache中永遠是最後一個系統的緩存數據,當刷新前面系統時,始終展現的是最後一個系統的操作。

     5、當然,session也可以不以cache的形式進行處理,因為像redis,memacache中有專門針對session共用的解決方案。


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

-Advertisement-
Play Games
更多相關文章
  • Python機器學習介紹(Python Machine Learning 中文版) 機器學習,如今最令人振奮的電腦領域之一。看看那些大公司,Google、Facebook、Apple、Amazon早已展開了一場關於機器學習的軍備競賽。從手機上的語音助手、垃圾郵件過濾到逛淘寶時的物品推薦,無一不用... ...
  • Python機器學習 機器學習,如今最令人振奮的電腦領域之一。看看那些大公司,Google、Facebook、Apple、Amazon早已展開了一場關於機器學習的軍備競賽。從手機上的語音助手、垃圾郵件過濾到逛淘寶時的物品推薦,無一不用到機器學習技術。 如果你對機器學習感興趣,甚至是想從事相關職業... ...
  • 一、前言 JUC這部分還有線程池這一塊沒有分析,需要抓緊時間分析,下麵開始ThreadPoolExecutor,其是線程池的基礎,分析完了這個類會簡化之後的分析,線程池可以解決兩個不同問題:由於減少了每個任務調用的開銷,它們通常可以在執行大量非同步任務時提供增強的性能,並且還可以提供綁定和管理資源(包 ...
  • 內容:Java變數,基本數據類型 邏輯類型:boolean =true/false整數類型:byte占一個位元組,short占兩個位元組,int占四個位元組,long占8個位元組 int 可以表達十進位範圍 (2147483648,4294967296)字元類型:char占兩個位元組 (加單引號)ch=97, ...
  • 前言 在一個小項目的需求中,我需要一個短鏈生成伺服器來縮短一些某個網站的鏈接。 剛開始我使用的是新浪的短鏈生成服務,後來心血來潮Google了一下短鏈生成的演算法,在知乎上看到了 "一個非常棒的構思" ,也就是直接使用資料庫的id的62進位形式作為短鏈索引。 當天我們就把新浪的短鏈換成了自己的服務,不 ...
  • 作為一個java的學習者,我相信JDBC是大家最早接觸也是入門級別的資料庫連接方式,所以我們先來回憶一下JDBC作為一種用於執行SQL語句的Java API是如何工作的。下麵的一段代碼就是最基本的JDBC開發流程。 在上代碼之前要先導入JDBC的jar包,由於我用的資料庫是mysql,所以要先導 入 ...
  • 兩個星期前,微軟發佈了 "EF Core 2.1 Preview 1" ,同時還發佈了 ".NET Core 2.1 Preview 1" 和 "ASP.NET Core 2.1 Preview 1" ;EF Core 2.1 Preview 1 除了 "許多小改進和超過100種產品錯誤修複之外" ...
  • 本次 Windows Developer Day,最值得期待的莫過於 Windows AI Platform 了,可以說是千呼萬喚始出來。觀看直播的開發者們,留言最多的也是 Windows AI Platform。 下麵結合微軟提供的展示過程,文檔和 Git Sample 來詳細分析一下。 基礎概念 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...