認識Session機制
前文也提到過,常用的會話跟蹤有兩種技術:Cookie和Session。今天就為大家講解一下Session機制。
什么是Session?
Session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。
實現用戶登錄
Session對應的類為javax.servlet.http.HttpSession類。每個來訪者對應一個Session對象,所有該客戶的狀態信息都保存在這個Session對象里。Session對象是在客戶端第一次請求服務器的時候創建的。Session也是一個key-value屬性對,通過getAttribute(String key)和setAttribute(String key,Object value)方法讀寫客戶狀態信息。
Session的生命周期
Session保存在服務器端,為了獲得更高的存取速度,服務器一般把Session保存在內存里。需要注意的是只有訪問jsp、Servlet等程序時才會創建Session,訪問HTML、IMAGE等靜態資源時並不會創建Session。Session生成后,只要用戶繼續訪問,服務器就會更新Session的最后訪問時間,並維護該Session。
由於會有越來越多的用戶訪問服務器,因此Session也會越來越多。為防止內存溢出,服務器會把長時間沒有活躍的用戶的Session從內存里刪除。這個時間就是Session的超時時間。如果超過了超時時間沒訪問服務器,Session就自動失效了。
Session的超時時間為maxInactiveInterval屬性,可以通過對應的getMaxInactiveInterval()獲取,通過setMaxInactiveInterval(long interval)修改。
Session的常用方法
URL地址重寫
雖然Session保存在服務器里,對客戶端是透明的,但是Session的正常運行也需要客戶端瀏覽器的支持。這是因為Session需要使用Cookie作為識別標志。HTTP協議是無狀態的,Session不能依據HTTP連接來判斷是否為同一用戶,因此服務器向客戶端瀏覽器發送一個名為JSESSIONID的Cookie,它的值為該Session的ID(也就是HttpSession.getId()的返回值)。Session依據該Cookie來識別是否為同一用戶。
如果客戶端瀏覽器將Cookie功能禁用,或者不支持Cookie怎么辦呢?比如很多手機就沒有支持Cookie的功能。Java Web提供了一種解決方案:URL地址重寫。
URL地址重寫的原理是將該用戶Session的id信息重寫到URL地址中。服務器能夠解析重寫后的URL獲取Session的id。這樣即使客戶端不支持Cookie,也可以使用Session來記錄用戶狀態。HttpServletResponse類提供了encodeURL(String url)實現URL地址重寫。