最近看到了 一篇關於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