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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...