session和cookie簡介

轉載註明出處:http://www.cnblogs.com/wdfwolf3/ 謝謝
會話跟蹤是Web程序中經常使用的技術,用來跟蹤用戶的整個會話。經常使用的技術是Cookie與Session。Cookie經過在客戶端記錄信息肯定用戶身份,Session經過在服務器端記錄信息肯定用戶身份。
1.Cookie
HTTP是一種無狀態的協議,服務器單從網絡鏈接上無從知道客戶身份。因此給客戶端們頒發一個通行證,客戶端訪問都必須攜帶本身通行證。這樣服務器就能從通行證上確認客戶身份了,這就是Cookie的工做原理。
Cookie其實是一小段的文本信息。客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還能夠根據須要修改Cookie的內容。
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規範
Cookie有效期
Cookie的maxAge屬性決定着Cookie的有效期,單位爲秒(Second)。若是maxAge爲負數,表示臨時性,不會被持久化,不會被寫到Cookie文件中,該Cookie僅在本瀏覽器窗口以及本窗口打開的子窗口內有效,關閉窗口後該Cookie即失效。若是maxAge爲0,則表示刪除該Cookie。Cookie機制沒有提供刪除Cookie的方法,所以經過設置該Cookie即時失效實現刪除Cookie的效果。失效的Cookie會被瀏覽器從Cookie文件或者內存中刪除。
Cookie是不可跨域名的
正常狀況下,同一個一級域名下的兩個二級域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,由於兩者的域名並不嚴格相同。若是想全部helloweenvsfei.com名下的二級域名均可以使用該Cookie,須要設置Cookie的domain參數。
Cookie保持登陸狀態
一種方案是把密碼加密後保存到Cookie中,下次訪問時解密並與數據庫比較。若是不但願保存密碼,還能夠把登陸的時間戳保存到Cookie與數據庫中,只驗證用戶名與登陸時間戳就能夠。另外一種方案,只在登陸時查詢一次數據庫,之後訪問驗證登陸信息時再也不查詢數據庫,實現方式是把帳號按照必定的規則加密後,連同帳號一塊保存到Cookie中。下次訪問時只須要判斷帳號的加密規則是否正確便可。
2.Session
Session保存在服務器上,客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,客戶端瀏覽器再次訪問時只須要從該Session中查找該客戶的狀態就能夠了。Session對象是在客戶端第一次請求服務器的時候建立的,Session也是一種key-value的屬性對,
Session超時時間
爲防止內存溢出,服務器會把長時間內沒有活躍的Session從內存刪除,這個時間就是Session的超時時間。若是超過了超時時間沒訪問過服務器,Session就自動失效了。Session生成後,只要用戶繼續訪問,服務器就會更新Session的最後訪問時間,並維護該Session。
Tomcat中Session的默認超時時間爲20分鐘。經過setMaxInactiveInterval(int seconds)修改超時時間。能夠修改web.xml改變Session的默認超時時間。例如修改成30分鐘:
<session-config>
   <session-timeout>30</session-timeout>      <!-- 單位:分鐘 -->
</session-config>
注意:<session-timeout>參數的單位爲分鐘,而setMaxInactiveInterval(int s)單位爲秒。
HttpSession的經常使用方法
方  法  名
描    述
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失效
客戶端支持
HTTP協議是無狀態的,Session不能依據HTTP鏈接來判斷是否爲同一客戶,所以服務器向客戶端瀏覽器發送一個名爲SESSIONID的Cookie,它的值爲該Session的id。Session依據該Cookie來識別是否爲同一用戶。該Cookie爲服務器自動生成的,它的maxAge屬性通常爲–1,表示僅當前瀏覽器內有效,而且各瀏覽器窗口間不共享,關閉瀏覽器就會失效。所以同一機器的兩個瀏覽器窗口訪問服務器時,會生成兩個不一樣的Session。可是由瀏覽器窗口內的連接、腳本等打開的新窗口(也就是說不是雙擊桌面瀏覽器圖標等打開的窗口)除外。這類子窗口會共享父窗口的Cookie,所以會共享一個Session。
注意:新開的瀏覽器窗口會生成新的Session,但子窗口除外。子窗口會共用父窗口的Session。
客戶端不支持Cookie
URL地址重寫是對客戶端不支持Cookie的解決方案。URL地址重寫的原理是將該用戶Session的id信息重寫到URL地址中。服務器可以解析重寫後的URL獲取Session的id。這樣即便客戶端不支持Cookie,也可使用Session來記錄用戶狀態。
相關文章
相關標籤/搜索