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


一.前言

  小朽不才,最近喜歡上了薩克斯,一年計划[傳送門]中的實行。就伴隨着一首薩克斯,整理了下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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM