一.前言
小朽不才,最近喜歡上了薩克斯,一年計划[傳送門]中的實行。就伴隨着一首薩克斯,整理了下Session管理和Session四種技術。
保存狀態:
#網址重寫(URL rewriting)
#隱藏域
#cookie
#HttpSession對象
二.網址重寫(URL rewriting)
裝好了哨片,拿着迪頭准備第一次,中音試吹
①它是一種追蹤技術,將一個或多個token添加到URL中:{格式 鍵 = 值}
url?key_1=value_1&key_2=value_2 ...
②但有弊端:
#url限制2000個字符
#空格 & 符合 問號 需編碼
#信息可見,這樣不是我們期待的
③獲取就簡單了,和我們上一節講的一樣[傳送門]:
request.getParameter("key_1");
支支吾吾,響了起來。然后慢慢練呼吸。堅持5秒,10秒,15秒.....
三.隱藏域
①它相比上一種,可以傳更多的字符到服務器,並且不用字符編碼。
典型的例子:{form 表單更新時候,Person類}
<form method ="post" action=""> <input type="hidden" name="personId" value="" > <input name="name" value=""> <input type="submit" value="Update"> </form>
支支吾吾,堅持30秒!很開心
四.cookie
它能自動在web服務器,瀏覽器直接來回傳遞小塊信息。每台web服務器支持20個cookie。但,瀏覽器可以拒絕接受cookie。
①創建:[也可以js創建刪除]
Cookie cookie = new Cookie(name,value);
發送給瀏覽器,就需要HttpServletResonse[傳送門]:
httpServletResponse.add(cookie);
②刪除:為了刪除cookie,創建一個同名的cookie,然后設置maxAge為0
我把手輕輕放在鍵上,我急切的想聽下音,但是還學技法,慢慢來。
強大的對象:
五.HttpSession對象
用戶可以沒有,或者有一個它,並且只能訪問自己的HttpSession。
①獲取HttpSession:
HttpSession getSession()返回當前的HttpSession,若沒有,則創建一個返回。
HttpSession getSession(true) 和HttpSession getSession()一樣。
HttpSession getSession(false)若沒有,返回null。
HttpSession getSession() HttpSession getSession(boolean create)
源碼:
HttpSession getSession()只不過調用了getSession(true) 。
public HttpSession getSession() { return (getSession(true)); }
與上面三種技術不同是,HttpSession存在內存中,所以保存內容要謹慎。如果一個java對象類實現了java.io.Serializable則可以存入HttpSession。但要求不同名稱,不然的話,新值覆蓋舊值(想必這是我們喜歡的)。
②獲取HttpSession保存的對象:
java.lang.Object getAttribute(java.lang.String name)
③注意,HttpSession中保存的值不發送到客戶端,這與其他Session管理方式不同,而Servlet容器為它每個HttpSession創建一個唯一標識符,將這個作為標識符token發送個瀏覽器,或作為cookie,或參數添加到url。無論哪一種都可以指的是哪個用戶發出請求,這就是session如何區分不同用戶機制。
自然,可以查看這個標識符JSESSIONID
java.lang.String getId()
如圖,有真相
第一次訪問:
第二次訪問:
④數據結構
在servlet/jsp中,容器是用何種數據結構來存儲session相關的變量的呢?我們猜測一下,首先它必須被同步操作,因為在多線程環境下session是線程間共享的,而web服務器一般情況下都是多線程的(為了提高性能還會用到池技術);其次,這個數據結構必須容易操作,最好是傳統的鍵值對的存取方式。 那么我們先具體到單個session對象,它除了存儲自身的相關信息,比如id之外,tomcat的session還提供給程序員一個用以存儲其他信息的接口(在類org.apache.catalina.session. StandardSession里):
public void setAttribute(String name, Object value, boolean notify) |
在這里可以追蹤到它到底使用了何種數據:
protected Map attributes = new ConcurrentHashMap(); |
tomcat使用了一個ConcurrentHashMap對象存儲數據,這是java的concurrent包里的一個類。它剛好滿足了我們所猜測的兩點需求:同步與易操作性。 那么tomcat又是用什么數據結構來存儲所有的session對象呢?果然還是ConcurrentHashMap(在管理session的org.apache.catalina.session. ManagerBase類里):
protected Map sessions = new ConcurrentHashMap(); |
具體原因就不必多說了。至於其他web服務器的具體實現也應該考慮到這兩點。
藝術是相通的,我覺得薩克斯,和coding,CS,我稱它CA(COMPUTER ART).所以我很喜歡coding,也很喜歡藝術。
六.總結及參考文獻[在此感謝]
網址重寫,隱藏域主要用於“輕量化”的Session追蹤技術。cookie和HttpSession比較靈活,但是絕非五局限。要特別小心,每個對象都會消耗內存。
http://book.douban.com/doulist/3575997/
http://kb.cnblogs.com/page/57228/