Cookie和Session

来源:http://www.cnblogs.com/wh1107/archive/2017/11/24/7892244.html
-Advertisement-
Play Games

最近看到了 一篇關於cookie和session的文章,寫的非常詳細全面,受益匪淺。寫一下從中學到了些什麼吧! 首先我們知道cookie和session是用來跟蹤會話的,因為http協議是無狀態的,也就是說伺服器和瀏覽器一旦結束會話,再次交換數據時就會創建新的會話。就像是A買了一件東西放入購物車,當 ...


最近看到了 一篇關於cookie和session的文章,寫的非常詳細全面,受益匪淺。寫一下從中學到了些什麼吧!

  首先我們知道cookie和session是用來跟蹤會話的,因為http協議是無狀態的,也就是說伺服器和瀏覽器一旦結束會話,再次交換數據時就會創建新的會話。就像是A買了一件東西放入購物車,當A又買了一樣東西,伺服器就不知道這件東西是屬於A還是屬於其他用戶了。所有為了彌補http的無狀態的缺陷,就產生了cookie和session。可以通過採用cookie將信息保留在客戶端解決,或者用session把信息保留在伺服器解決。

  Cookie:

 1. cookie是存在於客戶端的。既然伺服器不能判斷客戶身份,就給每個客戶發一個通行證吧,你來訪問我的時候就帶著你的通行證,我一看你的通行證信息就知道是誰訪問的我了。比如說:發給顧客一張卡片,上面記錄著消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯繫起來。這種做法就是在客戶端保持狀態。 【卡上記錄所有信息,而店家只認卡不認人。】一般用於設置免登錄操作

  客戶端請求伺服器的時候,伺服器會通過response給客戶端添加一個cookie,客戶端就會保存起來這一段文本信息,在以後訪問的時候帶著這個cookie,讓伺服器識別出自己。

還知道了一個有意思的tips:在瀏覽器地址欄輸入:javascript:alert(document.cookie),就會顯示這個網站給你頒發的cookie內容。以前不知道,孤陋寡聞了 :)

  2.Cookie的不可跨功能變數名稱性

    很多網站都有cookie,那他們怎麼區別是哪個網站的呢?也就說能不能跨網站對cookie進行操作呢?

    肯定是不能的,cookie具有不可跨功能變數名稱性,我們不能拿著谷歌的cookie訪問百度,也不能拿著百度的訪問谷歌,因為他們的功能變數名稱不一樣。需要註意的是,雖然網站images.google.com與網站www.google.com同屬於Google,但是功能變數名稱不一樣,他確實可以訪問的。因為可以通過設置cookie的一個屬性:String domain  可以訪問該Cookie的功能變數名稱。如果設置為“.google.com”,則所有以“google.com”結尾的功能變數名稱都可以訪問該Cookie。註意第一個字元必須為“.”     cookie.setDomain(".google.com");  

    cookie 還有很多其他的屬性:

屬  性  名

描    述

String name

該Cookie的名稱。Cookie一旦創建,名稱便不可更改

Object value

該Cookie的值。如果值為Unicode字元,需要為字元編碼。如果值為二進位數據,則需要使用BASE64編碼

int maxAge

該Cookie失效的時間,單位秒。如果為正數,則該Cookie在maxAge秒之後失效。如果為負數,該Cookie為臨時Cookie,關閉瀏覽器即失效,瀏覽器也不會以任何形式保存該Cookie。如果為0,表示刪除該Cookie。預設為–1

boolean secure

該Cookie是否僅被使用安全協議傳輸。安全協議。安全協議有HTTPS,SSL等,在網路上傳輸數據之前先將數據加密。預設為false

String path

該Cookie的使用路徑。如果設置為“/sessionWeb/”,則只有contextPath為“/sessionWeb”的程式可以訪問該Cookie。如果設置為“/”,則本功能變數名稱下contextPath都可以訪問該Cookie。註意最後一個字元必須為“/”

String domain

可以訪問該Cookie的功能變數名稱。如果設置為“.google.com”,則所有以“google.com”結尾的功能變數名稱都可以訪問該Cookie。註意第一個字元必須為“.”

String comment

該Cookie的用處說明。瀏覽器顯示Cookie信息的時候顯示該說明

int version

該Cookie使用的版本號。0表示遵循Netscape的Cookie規範,1表示遵循W3C的RFC 2109規範

 其他屬性的詳解我就不說了,大家可以去看原博。

   Session

    1.session是存在伺服器端的,客戶端訪問伺服器的時候,服務端把客戶端信息記錄在伺服器上,客戶端再次訪問的時候,伺服器就從該session獲取客戶信息就可以了。比如:發給顧客一張會員卡,除了卡號之外什麼信息也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裡的紀錄本上找到這個卡號對應的紀錄添加一些消費信息。這種做法就是在伺服器端保持狀態。 【只記用戶ID,而ID的詳細記錄放在店家的資料庫里;每次憑ID檢索伺服器的記錄。這個id就是sessionID】

   2.Session機制原理

    1)首次訪問伺服器上的一個JSP頁面時,JSP引擎產生一個session對象  

   2)每個session都有一個sessionid
  3)將sessionid保存在客戶端的Cookie中
  4)後續每次請求request都攜帶cookie到伺服器端
  5)伺服器端根據客戶端的sessionid判斷屬於哪個會話

  3.Session的生命周期

   當第一次訪問jsp,servlet等程式是才會創建session,HTML,imgs等靜態資源是不會創建的。session生成後,只要用戶繼續訪問,伺服器就會更新最後訪問時間,無論session是否發生讀寫,伺服器都認為session 活躍了一次。為了防止記憶體溢出(session存在記憶體里),伺服器會清理一定時間內沒有活躍的session,這個時間就是session的maxInactiveInterval。超過這個時間,session就過期了。或者調用invalidate()方法也會 讓session失效。關閉瀏覽器不會使session消失。

  4.session常用方法

方  法  名

描    述

void setAttribute(String attribute, Object value)

設置Session屬性。value參數可以為任何Java Object。通常為Java Bean。value信息不宜過大

String getAttribute(String attribute)

返回Session屬性

Enumeration getAttributeNames()

返回Session中存在的屬性名

void removeAttribute(String attribute)

移除Session屬性

String getId()

返回Session的ID。該ID由伺服器自動創建,不會重覆

long getCreationTime()

返回Session的創建日期。返回類型為long,常被轉化為Date類型,例如:Date createTime = new Date(session.get CreationTime())

long getLastAccessedTime()

返回Session的最後活躍時間。返回類型為long

int getMaxInactiveInterval()

返回Session的超時時間。單位為秒。超過該時間沒有訪問,伺服器認為該Session失效

void setMaxInactiveInterval(int second)

設置Session的超時時間。單位為秒

void putValue(String attribute, Object value)

不推薦的方法。已經被setAttribute(String attribute, Object Value)替代

Object getValue(String attribute)

不被推薦的方法。已經被getAttribute(String attr)替代

boolean isNew()

返回該Session是否是新創建的

void invalidate()

使該Session失效

Tomcat中Session的預設超時時間為20分鐘。通過setMaxInactiveInterval(int seconds)修改超時時間。可以修改web.xml改變Session的預設超時時間。例如修改為60分鐘:

<session-config>

   <session-timeout>60</session-timeout>      <!-- 單位:分鐘 -->

</session-config>

 

3.session與cookie的區別 

1)cookie數據存放在客戶端,session數據放在伺服器上(sessionid可以通過cookie保存在客戶端,也可以使用URL重寫方式)
2)cookie不是很安全(可以加密),別人可以分析存放在本地的COOKIE併進行COOKIE欺騙,考慮到安全應當使用session
3)session會在一定時間內保存在伺服器上。當訪問增多,會比較占用你伺服器的性能,考慮到減輕伺服器性能方面,應當使用COOKIE
4)單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。
5)Cookie的數據都以字元串的形式保存。Session中可以保存對象信息。

 

寫的不夠詳細,原博中有更詳細的說明,大家可以去看:

http://www.cnblogs.com/linguoguo/p/5106618.html

 


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

-Advertisement-
Play Games
更多相關文章
  • 在網站開發中,我們常常需要用到表單提交的方式,那麼在MVC中是如何獲取到表單中的數據呢?下麵我們來介紹以下幾種方式 首先我們先看看View前臺頁面 添加一個控制器 我們再看看前臺頁面的代碼 接下來我們進入正題,控制器如何去獲取表單代碼呢? 1.參數獲取,form表單中的name名稱要和action中 ...
  • 準備工作: 1.創建實體類:ClassInfo,預設想要對其按照班級學生數量進行排序 public class ClassInfo { /// <summary> /// 班級名稱 /// </summary> public string ClassName { get; set; } /// <s ...
  • 題目內容: 下圖為國內主要城市之間的公路里程: 你的程式要讀入這樣的一張表,然後,根據輸入的兩個城市的名稱,給出這兩個城市之間的里程。 註意:任何兩個城市之間的里程都已經給出,不需要計算經第三地中轉。 註意:你並不需要去錄入上圖的數據,數據是在程式輸入中給的。 輸入格式: 首先,你會讀到若幹個城市的 ...
  • 121,什麼是線程? 線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。程式員可以通過它進行多處理器編程,你可以使用多線程對運算密集型任務提速。比如,如果一個線程完成一個任務要100毫秒,那麼用十個線程完成改任務只需10毫秒。 122,線程和進程有什麼區別? 線程 ...
  • 【直接上代碼】 #coding=utf-8#1、先將正則表達式的字元串形式編譯為Pattern實例 #2、使用Pattern實例處理文本並獲得匹配結果 #3、最後使用Match實例獲得消息,進行其他操作 import re # 【1】 re.compile(string[,flag]) 將正則表達式 ...
  • 《瘋狂java講義·第三版》,全書共851頁,18章。 目錄如下: 第1章 Java語言概述與開發環境 第2章 理解面向對象 第3章 數據類型和運算符 第4章 流程式控制制與數組 第5章 面向對象(上) 第6章 面向對象(下) 第7章 Java基礎類庫 第8章 Java集合 第9章 泛型 第10章 異常 ...
  • 1、單一界面的創建 2、常用操作方法 3、有些組件setSize不起作用時,用setPreferredSize,例如button.setPreferredSize(new Dimension(60, 22)); 4、表格一般用模型創建,方便更新管理: 表格數據的清除和更新: 5、消息提示框 ...
  • 什麼是virtualenv? virtualenv可以創建獨立Python開發環境,比如當前的全局開發環境是python3.6,現在我們有一個項目需要使用django1.3,另一個項目需要使用django1.9,這個時候就可以使用virtualenv創建各自的python開發環境了。 virtual ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...