②薩克斯,音符的悠揚(Session管理)

一.前言

  小朽不才,最近喜歡上了薩克斯,一年計劃[傳送門]中的實行。就伴隨着一首薩克斯,整理了下Session管理和Session四種技術。html

  保存狀態:java

       #網址重寫(URL rewriting)

       #隱藏域

       #cookie

       #HttpSession對象

 

二.網址重寫(URL rewriting)

  裝好了哨片,拿着迪頭準備第一次,中音試吹程序員

 

  ①它是一種追蹤技術,將一個或多個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秒!很開心

 

四.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/

相關文章
相關標籤/搜索