轉載註明出處: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來記錄用戶狀態。