小朽不才,最近喜歡上了薩克斯,一年計劃[傳送門]中的實行。就伴隨着一首薩克斯,整理了下Session管理和Session四種技術。html
保存狀態:java
裝好了哨片,拿着迪頭準備第一次,中音試吹程序員
①它是一種追蹤技術,將一個或多個token添加到URL中:{格式 鍵 = 值} web
url?key_1=value_1&key_2=value_2 ...
②但有弊端:apache
#url限制2000個字符瀏覽器
#空格 & 符合 問號 需編碼tomcat
#信息可見,這樣不是咱們期待的服務器
③獲取就簡單了,和咱們上一節講的同樣[傳送門]:cookie
request.getParameter("key_1");
支支吾吾,響了起來。而後慢慢練呼吸。堅持5秒,10秒,15秒.....session
①它相比上一種,能夠傳更多的字符到服務器,而且不用字符編碼。
典型的例子:{form 表單更新時候,Person類}
<form method ="post" action=""> <input type="hidden" name="personId" value="" > <input name="name" value=""> <input type="submit" value="Update"></form>
支支吾吾,堅持30秒!很開心
它能自動在web服務器,瀏覽器直接來回傳遞小塊信息。每臺web服務器支持20個cookie。但,瀏覽器能夠拒絕接受cookie。
①建立:[也能夠js建立刪除]
Cookie cookie = new Cookie(name,value);
發送給瀏覽器,就須要HttpServletResonse[傳送門]:
httpServletResponse.add(cookie);
②刪除:爲了刪除cookie,建立一個同名的cookie,而後設置maxAge爲0
我把手輕輕放在鍵上,我急切的想聽下音,可是還學技法,慢慢來。
強大的對象:
用戶能夠沒有,或者有一個它,而且只能訪問本身的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比較靈活,可是絕非五侷限。要特別當心,每一個對象都會消耗內存。