淺談Cookie與Session技術

2021-01-08 宋同煜

一、什麼是狀態管理

將客戶端與伺服器之間多次交互當做一個整體來看,並且將多次交互所涉及的數據(狀態)保存下來。

會話:當用戶打開瀏覽器,訪問多個WEB資源,然後關閉瀏覽器的過程,稱之為一個會話,選項卡,彈出頁面都屬於這個會話,且共享同一個session。

注意:具體會話和瀏覽器版本,廠商有關,如IE7及以下,每開一個瀏覽器都創建一個新的session,而IE8及以上,則實現多個瀏覽器共享同一個session。因為IE8及以上,都共享同一個進程,只開闢一個內存空間。目前較多主流的瀏覽器都實現同一臺主機上的多個瀏覽器,共享同一個進程。

二、如何進行狀態管理

方式一:將狀態保存在客戶端。方式二:將狀態保存在伺服器端。

三、cookie技術(客戶端技術)

(1)什麼是cookie

a、cookie是一種客戶端的狀態管理技術b、當瀏覽器向伺服器發送請求的時候,伺服器會將少量的數據以set-cookie消息頭的方式發送給瀏覽器,當瀏覽器再次訪問伺服器時,會將這些數據以cookie消息頭的方式發送給伺服器。

(2)如何創建一個cookie

Cookie c = new Cookie(String name,String value);response.addCookie(c);默認情況下,cookie保存在瀏覽器內存中

(3)cookie的查詢

Cookie[] cookie = request.getCookies();

注意:該方法有可能返回nullString cookie.getName():查找cookie的名字String cookie.getValue():查找cookie的值

(4)cookie的生存時間

cookie.setMaxAge(int seconds):cookie的保存時間seconds>0:瀏覽器會將cookie保存在硬碟上,超過指定時間會刪除該cookieseconds<0:預設值,只將cookie保存在內存中,只要瀏覽器不關閉,cookie就一致保存,瀏覽器一旦關閉,cookie就會被清空。seconds=0:立即刪除cookie,如要刪除一個叫userID的cookie,那麼可以這麼做:Cookiec = new Cookie("userID","");c.setMaxAge(0);response.addCookie(c);

(5)cookie的編碼問題

cookie只能保存ascii字符,對於不合法的字符(如中文)需要轉換成ascii碼

例:Cookie cookie3 = new Cookie("realname",URLEncoder.encode("姓名","utf-8"));

(6)cookie的路徑問題

a、什麼是cookie的路徑問題?瀏覽器在向伺服器發送請求時,會比較cookie的路徑要與訪問的伺服器的路徑是否匹配,只有匹配的cookie才會發送給伺服器。b、cookie的默認路徑默認路徑等於創建該cookie的組件路徑c、匹配規則瀏覽器要訪問的路徑必須是cookie的路徑或者其子路徑時,才會發送對應的cookied、設置cookie的路徑cookie.setPath(String path)如:cookie.setPath("/appname");這樣保證這個cookie可以被整個web應用訪問。

(7)cookie域

setDomain:設置cookie域,指的是訪問某個域的時候,才會帶入cookie,訪問其他域,不會帶入cookie。默認會禁止該設置,因為安全性較差,如,訪問baidu.com,baidu.com寫一個域是google.com的cookie,那麼訪問google.com的時候會帶入baidu.com的cookie,從而會實現攻擊的效果。

(8)cookie的限制

a、cookie可以被用戶禁止b、cookie不完全,敏感數據,比如密碼、帳號等需要加密。c、cookie的大小有限制,大約為4K左右d、cookie的個數也有限制,大約是300個左右e、每個站點最多保存20個cookief、cookie只能夠保存字符串。

四、session技術(伺服器端)

(1)什麼是session?

a、session是一種伺服器端的狀態管理技術。b、session是基於cookie的技術。c、當瀏覽器訪問伺服器時,伺服器會創建一個session對象(該對象有一個唯一的id號,稱之為sessionId)伺服器在默認的情況下,會將sessionId以cookie的方式,發送給瀏覽器,瀏覽器會將sessionId保存到內存中。當瀏覽器再次訪問伺服器時,會將sessionId發送給伺服器,伺服器依據sessionId就可以找到之間創建的session對象。

(2)如何獲取session對象?

方式一:HttpSession s = request.getSession(boolean flag);當flag=true時,伺服器會先查看請求當中有沒有sessionId,如果沒有,則創建一個session對象。如果有,會依據sessionId查找對應的session對象。如果找到,則返回該session對象,如果找不到,則創建一個新的session對象。當flag=false時,伺服器會先查看請求當中有沒有sessionId,如果沒有則返回null,如果有,會依據sessionId查找對應的session對象。如果找到,則返回該session對象,如果找不到,返回null。方式二:HttpSession s = request.getSession();等價於request.getSession(true);

(3)常用方法

String serssion.getId();// 得到session的ID

session.setAttribute(String name,Object obj);// obj最好實現序列化Serializable接口,應為伺服器在持久化session時,會使用java序列化協議。

session.getAttribute(String name);// 如果name不存在則返回null

session.removeAttribute(String name);// 刪除session中的指定屬性

(4)session超時

所謂session的超時,指的是伺服器會將空閒時間過長的session對象從內存空間刪除掉,原因是過多的session對象會影響程序的正常運行,會佔用伺服器的內存空間。大部分伺服器都會有一個預設的超時限制,一般是30分鐘,可以修改伺服器的預設超時限制。如修改tomcat的session超時時間,可以在conf/web.xml中的

<session-config><session-timeout>30</session-timeout></session-config>

也可以將以上配置放到某個WEB應用的web.xml中,這樣可以特定設置某個WEB應用的session超時時間。另外,還可以通過session.setMaxInactiveInterval(int seconds);設置session的超時時間。

(5)session的生命周期

session的創建:當用戶訪問某個可以創建session的servlet的時候,該servlet才會創建session。當session超過默認時間或用戶指定的session時間後,session才會消亡。

(6)刪除session

session.invalidate();

(7)持久化session方案

session默認是存儲在瀏覽器內存中,默認時間是30分鐘(根據不同的WEB伺服器設置而定)。且session也是通過cookie來實現發送到瀏覽器內存中的。所以可以考慮用cookie來替換該session。如果用戶在中途關閉瀏覽器的話,那麼session就隨著瀏覽器內存的釋放而釋放,那麼如果想持久化session的話,可以考慮使用cookie技術。

Step1、獲取sessionID。Step2、通過JSESSIONID,然後將sessionID的值寫入cookie,在通過設置保存時間,路徑,來持久化該session。

(8)URL地址編碼(用戶禁用cookie的解決辦法)

如果用戶禁用了cookie,那麼在編寫超連結的時候,必須使用URL編碼,即:

response. encodeURL(url);

什麼是URL重寫?

簡單的說,如果某個組件需要session機制的支持,且用戶禁止了cookie,則不能直接使用該組件的地址去訪問,而應該使用伺服器生成的組件的地址(會在組件的地址後面添加sessionId)去訪問。如何重寫?

用在連接地址,表單提交地址。

response.encodeURL(String url);

如果是重定向。

sesponse.encodeRedirectURL(「list.jsp」);

這樣編譯過的URL地址就會自動在後面添加用戶session的id號,那麼所有的連接地址就會按如下格式進行輸出,即每個地址都記錄了用戶的信息:

href='/JavaWeb/servlet/BuySession;jsessionid=283087307F0E79CC62208BDCF79FC52A'

這種方式不能實現用戶數據持久化。

(9)session的相關細節

如果即使用了URL地址編碼,也設置了寫出cookie,那麼第一次訪問的時候伺服器會即帶入cookie同時也進行URL地址編碼,當再次訪問伺服器時,伺服器已經判斷出了瀏覽器是否禁用了cookie,如果沒有禁用,則使用cookie寫入的方式,如果禁用了則使用URL地址編碼的方式

(10)session的優缺點

優點:1、session相對安全。2、session能夠保存的數據類型更豐富。3、session能夠保存的數據大小沒有限制。

缺點:1、session需要將所有數據寫在伺服器端,所以伺服器會佔用過多的內存空間,會影響伺服器性能。可以考慮使用cookie或資料庫來保存數據。

(11)session案例

a、session登錄驗證

step1、在登錄成功以後,在session對象上綁定數據,比如:session.setAttribute(「user」,user);step2、對需要保護的資源(只有登錄成功以後才能訪問的資源,比如主頁),添加session驗證代碼:Object obj = session.getAttribute(「user」);If(obj==null)就跳轉到登錄界面

b、驗證碼生成一個驗證碼,然後將驗證碼存儲到session中,然後從session中取出驗證碼與客戶提交的驗證碼進行比對,這是一個典型的session應用。

相關焦點

  • 淺談cookie,sessionStorage,localStorage
    從技術上說,儘管 Local Storage 只能存儲字符串,但是它也是可以存儲字符串化的JSON數據。這就意味著,Local Storage 能比 Cookies 存儲更複雜的數據。', JSON.stringify(updatedUser))// DeletesessionStorage.removeItem('user')優點,缺點和瀏覽器支持和 Local Storage 一樣sessionStorage、localStorage、cookie都是在瀏覽器端存儲的數據,其中sessionStorage的概念很特別
  • 關於Cookie與session會話技術的示例
    ——藉助於兩種會話技術。Cookie是客戶端技術,程序把每個用戶的數據以cookie的形式寫給用戶各自的瀏覽器。當用戶使用瀏覽器再去訪問伺服器中的web資源時,就會帶著各自的數據去。這樣,web資源處理的就是用戶各自的數據了(Cookie翻譯成中文是小甜點,小餅乾的意思。在HTTP中它表示伺服器送給客戶端瀏覽器的小甜點。
  • Session和cookie筆記
    會話技術1. 會話:一次會話中包含多次請求和響應。 * 一次會話:瀏覽器第一次給伺服器資源發送請求,會話建立,直到有一方斷開為止2. 功能:在一次會話的範圍內的多次請求間,共享數據3. 方式: 1. 客戶端會話技術:Cookie 2.
  • Cookie、Session、localStorage與sessionStorage詳解
    id 是存在 Cookie中的cookie與session的區別cookie數據存放在客戶的瀏覽器上,session數據放在伺服器上cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。
  • session和cookie魅力所在
    1. session概念:現階段的網站要求軟體對一個事務處理要有一個記憶功能,也就是常說的狀態。實現Web應用的技術核心http協議是一個無狀態的協,為了讓Web應用開發保持狀態,就出現了保持http連結的狀態的兩種技術:一個是cookie技術,另一個是session技術。
  • cookie、session、sessionid、jessionid傻傻分不清楚?一篇搞懂
    具體來說,cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制來達到保存標識的目的,但實際上它還有其他選擇。
  • cookie、session、sessionid、jessionid傻傻分不清楚?一篇搞懂
    cookie、session、sessionid 與jsessionid,很多人還傻傻分不清楚,下面來看個有趣的場景來幫你理解四者間的關係。然後就又出現session的方式用於保存用戶信息的行為,這種方式的原理與前面介紹銀行卡的方式是一樣的。具體來說,cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制來達到保存標識的目的,但實際上它還有其他選擇。
  • 從session、cookie到token以及JWT
    主要講token和jwt技術,關於session和cookie文章很多。簡單提一下session和cookie現在一般都是session和cookie一起用,一起提。但是他們倆其實不是一定要在一起。首先牢記一點,http協議是無狀態的。
  • 基礎面試系列-session與cookie區別
    1.為什麼會有cookie和session這是因為http協議的無狀態性,如用戶訪問www.jd.com/a.htmlwww.jd.com/b.html這兩個頁面是沒有任何關係的,那怎麼標識這兩次是一個人訪問的呢,cookie和session就應運而生了。
  • session與cookie引發的一個小故事
    今天在公司加班,突然心血來潮想看看公司一款產品的後管平臺登錄圖片驗證碼是如何實現的,發現用的方案就是session。首先加載頁面時去得到驗證碼,後臺將驗證碼數字存入到session中,然後在登陸時把前端傳入的驗證碼數字同後臺取出的碼進行比較,比較之前首先把原來的session移除掉。
  • Cookie、Session、Token那點事兒
    作者:騎小豬看流星連結前言:新公司項目中使用到了Cookie,在各大Android技術討論群向前輩們取經討論這cookie、session、token這仨哥們的時候,很多開發者說法不一各抒已見,所以是時候回顧下http基礎以及總結開發經驗了。
  • Token、Cookie和Session的區別與使用場景
    session就是回話,這是服務端的一種操作。當你第一次訪問一個web網站的時候,服務端會生成一個session,並有一個sessionid和他對應。這個session是存儲到內存中的,你可以向這個session中寫入信息,比如當前登錄用戶的信息。sessionid會被返回到客戶端,客戶端一般採用cookie來保存。當然這個cookie不用人為寫入。
  • cookie和session原來還有這樣的關係
    那麼問題來了,我怎麼登錄,登錄成功後,刷新下,伺服器就不認識我了,不展示我的信息了,這怎麼能行,於是cookie就產生了,cookie是存在客戶端的,最常見的就是瀏覽器了,你第一次訪問頁面的時候,伺服器會返回個cookie給你,這個cookie其實就是sessionId,並存於客戶端,第二次的時候,你刷新頁面的時候,瀏覽器就會帶上之前的cookie,cookie就像通行證,每人一個,無論誰訪問都必須攜帶自己通行證
  • Springboot登錄cookie和session攔截案例
    2、每次登錄的時候都要進資料庫校驗下帳戶名和密碼,只是加了cookie 或session驗證後;比如登錄頁面A,登錄成功後進入頁面B,若此時cookie過期,在頁面B中新的請求url到頁面c,系統會讓它回到初始的登錄頁面。(類似單點登錄sso(single sign on))。
  • Springboot登錄後cookie和session攔截
    2、每次登錄的時候都要進資料庫校驗下帳戶名和密碼,只是加了cookie 或session驗證後;比如登錄頁面A,登錄成功後進入頁面B,若此時cookie過期,在頁面B中新的請求url到頁面c,系統會讓它回到初始的登錄頁面。(類似單點登錄sso(single sign on))。
  • session技術的基本使用
    session技術session技術,也是會話技術——即用於區分不同用戶(瀏覽器)的一種技術;session技術,它是把數據存儲在「伺服器端」;session技術,它基本上依賴於cookie技術。session技術原理:原理圖:實際上,該用來標識一個用戶的「唯一身份」的cookie數據:其名字為:PHPSESSID //其實就是cookie名。其值類似:40324;e320424;w$$%@s32455235 ——隨機不重複!
  • session原理終極版-一文弄懂session會話與cookie 秒殺CSDN
    首先我們來看一下瀏覽器保存的cookie長什麼樣子。如上圖,請求頭中包含了cookie,是否長連結,瀏覽器參數,請求數據類型等等。session是如何工作的?session有兩種傳遞方式:第一種通過cookies實現。第二種通過URL重寫來實現。我們先來說說第一種,也是應用最廣泛的。當你第一次訪問當前網站的時候,一個session就被第一次啟用,一個唯一標誌被存儲在本地的cookie中。
  • 會話技術之 session
    會話技術之 session含義:伺服器端會話技術一次會話中,多次的請求中間共享數據,將數據保存在伺服器端的對象中--HttpSession1、原理:session的實現是依賴於cookie的。session的實現是依賴於cookie的,為什麼這麼說呢?
  • Django框架cookie和session的詳解
    以鍵值對的方式存儲在瀏覽器當中 2. cookie 基於域名安全,意思就是不同的域名cookie是不能相互訪問的, 比如:同一瀏覽器中同時訪問 &34; 和 &34; ,它們各自網站的cookie 是不能相互訪問獲取的,這是它的獨立性和安全性。 3. 瀏覽器訪問某一個網站的時候,會將瀏覽器存儲的相關網站的所有的cookie 都發送給該網站的伺服器。
  • Go語言Echo Web框架7-Cookie和Session
    (), c.Response()) return c.NoContent(http.StatusOK)})自定義配置用法e := echo.New()e.Use(session.MiddlewareWithConfig(session.Config{}))