<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 188,comments - 176,trackbacks - 0

    由于項(xiàng)目需要,最近用session容器比較多,傳載的同時(shí)加上了自己的一些理解,不足之處還請(qǐng)大家補(bǔ)充和糾正。


    一、cookie機(jī)制和session機(jī)制的區(qū)別
    *************************************************************************************
    Cookie是客戶端的存儲(chǔ)空間,由瀏覽器來維持。具體來說cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案。同時(shí)我們也看到,由于才服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí),所以session機(jī)制可能需要借助于cookie機(jī)制來達(dá)到保存標(biāo)識(shí)的目的,但實(shí)際上還有其他選擇,比如說重寫URL和隱藏表單域。

    *************************************************************************************
    二、會(huì)話cookie和持久cookie的區(qū)別
    *************************************************************************************

    如果不設(shè)置過期時(shí)間,則表示這個(gè)cookie生命周期為瀏覽器會(huì)話期間,只要關(guān)閉瀏覽器窗口,cookie就消失了。這種生命期為瀏覽會(huì)話期的cookie被稱為會(huì)話cookie。會(huì)話cookie一般不保存在硬盤上而是保存在內(nèi)存里。

    如果設(shè)置了過期時(shí)間(setMaxAge(60*60*24)),瀏覽器就會(huì)把cookie保存到硬盤上,關(guān)閉后再次打開瀏覽器,這些cookie依然有效直到超過設(shè)定的過期時(shí)間。存儲(chǔ)在硬盤上的cookie可以在不同的瀏覽器進(jìn)程間共享,比如兩個(gè)IE窗口。而對(duì)于保存在內(nèi)存的cookie,不同的瀏覽器有不同的處理方式。(在IE下測(cè)試通過)

    *************************************************************************************
    三、如何利用實(shí)現(xiàn)自動(dòng)登錄
    *************************************************************************************

    當(dāng)用戶在某個(gè)網(wǎng)站注冊(cè)后,就會(huì)收到一個(gè)惟一用戶ID的cookie。客戶后來重新連接時(shí),這個(gè)用戶ID會(huì)自動(dòng)返回,服務(wù)器對(duì)它進(jìn)行檢查,確定它是否為注冊(cè)用戶且選擇了自動(dòng)登錄,從而使用戶務(wù)需給出明確的用戶名和密碼,就可以訪問服務(wù)器上的資源。

    *************************************************************************************
    四、如何根據(jù)用戶的愛好定制站點(diǎn)
    *************************************************************************************

    網(wǎng)站可以使用cookie記錄用戶的意愿。對(duì)于簡(jiǎn)單的設(shè)置,網(wǎng)站可以直接將頁面的設(shè)置存儲(chǔ)在cookie中完成定制。然而對(duì)于更復(fù)雜的定制,網(wǎng)站只需僅將一個(gè)惟一的標(biāo)識(shí)符發(fā)送給用戶,由服務(wù)器端的數(shù)據(jù)庫存儲(chǔ)每個(gè)標(biāo)識(shí)符對(duì)應(yīng)的頁面設(shè)置。

    *************************************************************************************
    五、cookie的發(fā)送
    *************************************************************************************

    1.創(chuàng)建Cookie對(duì)象
    2.設(shè)置最大時(shí)效
    3.將Cookie放入到HTTP響應(yīng)報(bào)頭

    如果你創(chuàng)建了一個(gè)cookie,并將他發(fā)送到瀏覽器,默認(rèn)情況下它是一個(gè)會(huì)話級(jí)別的cookie:存儲(chǔ)在瀏覽器的內(nèi)存中(服務(wù)器自動(dòng)創(chuàng)建一個(gè)cookie并將jsessionId作為key,sessionId的值作為value發(fā)送到客戶端瀏覽器內(nèi)存中),用戶退出瀏覽器之后被刪除。如果你希望瀏覽器將該cookie存儲(chǔ)在磁盤上,則需要使用maxAge,并給出一個(gè)以秒為單位的時(shí)間。將最大時(shí)效設(shè)為0則是命令瀏覽器刪除該cookie。發(fā)送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個(gè)Set-Cookie HTTP請(qǐng)求報(bào)頭中。由于這個(gè)方法并不修改任何之前指定的Set-Cookie報(bào)頭,而是創(chuàng)建新的報(bào)頭,因此我們將這個(gè)方法稱為是addCookie,而非setCookie。同樣要記住響應(yīng)報(bào)頭必須在任何文檔內(nèi)容發(fā)送到客戶端之前設(shè)置。

    *************************************************************************************
    六、cookie的讀取
    *************************************************************************************

    1.調(diào)用request.getCookie
    要獲取有瀏覽器發(fā)送來的cookie,需要調(diào)用HttpServletRequest的getCookies方法,這個(gè)調(diào)用返回Cookie對(duì)象的數(shù)組,對(duì)應(yīng)由HTTP請(qǐng)求中Cookie報(bào)頭輸入的值。

    2.對(duì)數(shù)組進(jìn)行循環(huán),調(diào)用每個(gè)cookie的getName方法,直到找到感興趣的cookie為止,cookie與你的主機(jī)(域)相關(guān),而非你的servlet或JSP頁面。因而,盡管你的servlet可能只發(fā)送了單個(gè)cookie,你也可能會(huì)得到許多不相關(guān)的cookie。
    例如:(login.jsp頁面cookie實(shí)現(xiàn)用戶名userName填寫)

    login.jsp:

    <%
      String username 
    = "";
            
    //從客戶端讀取硬盤中的cookie文件
            Cookie[] cookies = request.getCookies(); 
            
    if(cookies == null)
               username 
    = "";
            }

           
    else{
              
    for (int i = 0; i < cookies.length; i++){
                    
    if ("USERNAME".equalsIgnoreCase(cookies[i].getName())){
                        username 
    = cookies[i].getValue();
                   }

            }

    %>
      
    <form name="login"  method="post" action="login.do">
          
    <td width="100%" bgcolor="#CCCCCC" colspan="2">
       
    <p align="left">用戶名<br>
                  
    <input type="text" name="username" value= "<%=username%>">
          
    </p>
          
    <p align="left">密 碼 <br>
                  
    <input type="password" name="password">
          
    </p>
           
    <p align="left">
             
    <input type="submit" name="Submit" value="確定">
             
    <input name="reset" type="reset"  value="取消">
           
    </p>
     
    </form>

    LoginAction:
                    
    //將正確userName放入c1對(duì)象,并用"USERNAME"做key標(biāo)識(shí)
                   Cookie c1= new Cookie("USERNAME",logindto.getUsername());
                   
    //如果不設(shè)置時(shí)間,則cookie為會(huì)話cookie,不寫入客戶端硬盤
                   c1.setMaxAge(60*60*24);   
                   response.addCookie(c1);  



    *************************************************************************************
    七、如何使用cookie檢測(cè)初訪者
    *************************************************************************************

    A.調(diào)用HttpServletRequest.getCookies()獲取Cookie數(shù)組
    B.在循環(huán)中檢索指定名字的cookie是否存在以及對(duì)應(yīng)的值是否正確
    C.如果是則退出循環(huán)并設(shè)置區(qū)別標(biāo)識(shí)
    D.根據(jù)區(qū)別標(biāo)識(shí)判斷用戶是否為初訪者從而進(jìn)行不同的操作

    *************************************************************************************
    八、使用cookie檢測(cè)初訪者的常見錯(cuò)誤
    *************************************************************************************

    不能僅僅因?yàn)閏ookie數(shù)組中不存在在特定的數(shù)據(jù)項(xiàng)就認(rèn)為用戶是個(gè)初訪者。如果cookie數(shù)組為null,客戶可能是一個(gè)初訪者,也可能是由于用戶將cookie刪除或禁用造成的結(jié)果。但是,如果數(shù)組非null,也不過是顯示客戶曾經(jīng)到過你的網(wǎng)站或域,并不能說明他們?cè)?jīng)訪問過你的servlet。其它servlet、JSP頁面以及非Java Web應(yīng)用都可以設(shè)置cookie,依據(jù)路徑的設(shè)置,其中的任何cookie都有可能返回給用戶的瀏覽器。

    正確的做法是判斷cookie數(shù)組是否為空且是否存在指定的Cookie對(duì)象且值正確。

    *************************************************************************************
    九、使用cookie屬性的注意問題
    *************************************************************************************

    屬性是從服務(wù)器發(fā)送到瀏覽器的報(bào)頭的一部分;但它們不屬于由瀏覽器返回給服務(wù)器的報(bào)頭。

    因此除了名稱和值之外,cookie屬性只適用于從服務(wù)器輸出到客戶端的cookie;服務(wù)器端來自于瀏覽器的cookie并沒有設(shè)置這些屬性。因而不要期望通過request.getCookies得到的cookie中可以使用這個(gè)屬性。這意味著,你不能僅僅通過設(shè)置cookie的最大時(shí)效,發(fā)出它,在隨后的輸入數(shù)組中查找適當(dāng)?shù)腸ookie,讀取它的值,修改它并將它存Cookie,從而實(shí)現(xiàn)不斷改變的cookie值

    *************************************************************************************
    十、如何使用cookie記錄各個(gè)用戶的訪問計(jì)數(shù)
    *************************************************************************************

    1.獲取cookie數(shù)組中專門用于統(tǒng)計(jì)用戶訪問次數(shù)的cookie的值
    2.將值轉(zhuǎn)換成int型
    3.將值加1并用原來的名稱重新創(chuàng)建一個(gè)Cookie對(duì)象
    4.重新設(shè)置最大時(shí)效
    5.將新的cookie輸出

    *************************************************************************************
    十一、session在不同環(huán)境下的不同含義
    *************************************************************************************

    session,中文經(jīng)常翻譯為會(huì)話,其本來的含義是指有始有終的一系列動(dòng)作/消息,比如打電話是從拿起電話撥號(hào)到掛斷電話這中間的一系列過程可以稱之為一個(gè)session。然而當(dāng)session一詞與網(wǎng)絡(luò)協(xié)議相關(guān)聯(lián)時(shí),它又往往隱含了“面向連接”和/或“保持狀態(tài)”這樣兩個(gè)含義。

    session在Web開發(fā)環(huán)境下的語義又有了新的擴(kuò)展,它的含義是指一類用來在客戶端與服務(wù)器端之間保持狀態(tài)的解決方案。有時(shí)候Session也用來指這種解決方案的存儲(chǔ)結(jié)構(gòu)。

    *************************************************************************************
    十二、session的機(jī)制
    *************************************************************************************

    session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來保存息。

    但程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session的時(shí)候,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否包含了一個(gè)session標(biāo)識(shí)-稱為session id,如果已經(jīng)包含一個(gè)session id則說明以前已經(jīng)為此客戶創(chuàng)建過session,服務(wù)器就按照session id把這個(gè)session檢索出來使用(如果檢索不到,可能會(huì)新建一個(gè),這種情況可能出現(xiàn)在服務(wù)端已經(jīng)刪除了該用戶對(duì)應(yīng)的session對(duì)象,但用戶人為地在請(qǐng)求的URL后面附加上一個(gè)JSESSION的參數(shù))。如果客戶請(qǐng)求不包含session id,則為此客戶創(chuàng)建一個(gè)session并且同時(shí)生成一個(gè)與此session相關(guān)聯(lián)的session id,這個(gè)session id將在本次響應(yīng)中返回給客戶端保存。

    *************************************************************************************
    十三、保存session id的幾種方式
    *************************************************************************************

    A.保存session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)送給服務(wù)器。
    B.由于cookie可以被人為的禁止,必須有其它的機(jī)制以便在cookie被禁止時(shí)仍然能夠把session id傳遞回服務(wù)器,經(jīng)常采用的一種技術(shù)叫做URL重寫,就是把session id附加在URL路徑的后面,附加的方式也有兩種,一種是作為URL路徑的附加信息,另一種是作為查詢字符串附加在URL后面。網(wǎng)絡(luò)在整個(gè)交互過程中始終保持狀態(tài),就必須在每個(gè)客戶端可能請(qǐng)求的路徑后面都包含這個(gè)session id。如果客戶端Cookie禁用,則服務(wù)器可以自動(dòng)通過重寫URL的方式來保存Session的值,并且這個(gè)過程對(duì)程序員透明。(IE6.0除外)
    C.另一種技術(shù)叫做表單隱藏字段。就是服務(wù)器會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器。

    *************************************************************************************
    十四、session什么時(shí)候被創(chuàng)建
    *************************************************************************************

    一個(gè)常見的誤解是以為session在有客戶端訪問時(shí)就被創(chuàng)建,然而事實(shí)是直到某server端程序調(diào)用HttpServletRequest.getSession(true)這樣的語句時(shí)才被創(chuàng)建。

    注意如果JSP沒有顯示的使用 <% @page session="false"%> 關(guān)閉session,則JSP文件在編譯成Servlet時(shí)將會(huì)自動(dòng)加上這樣一條語句 HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對(duì)象的來歷。

    由于session會(huì)消耗內(nèi)存資源,因此,如果不打算使用session,應(yīng)該在所有的JSP中關(guān)閉它。

    *************************************************************************************
    十五、session何時(shí)被刪除
    *************************************************************************************

    session在下列情況下被刪除:
    A.程序調(diào)用HttpSession.invalidate()
    B.距離上一次收到客戶端發(fā)送的session id時(shí)間間隔超過了session的最大有效時(shí)間
    C.服務(wù)器進(jìn)程被停止

    再次注意關(guān)閉瀏覽器只會(huì)使存儲(chǔ)在客戶端瀏覽器內(nèi)存中的session cookie失效,不會(huì)使服務(wù)器端的session對(duì)象失效,除非此時(shí)Server端剛好session失效時(shí)間到了。

    *************************************************************************************
    十六、URL重寫有什么缺點(diǎn)
    *************************************************************************************

    對(duì)所有的URL使用URL重寫,包括超鏈接,form的action,和重定向的URL。每個(gè)引用你的站點(diǎn)的URL,以及那些返回給用戶的URL(即使通過間接手段,比如服務(wù)器重定向中的Location字段)都要添加額外的信息。

    這意味著在你的站點(diǎn)上不能有任何靜態(tài)的HTML頁面(至少靜態(tài)頁面中不能有任何鏈接到站點(diǎn)動(dòng)態(tài)頁面的鏈接)。因此,每個(gè)頁面都必須使用servlet或JSP動(dòng)態(tài)生成。即使所有的頁面都動(dòng)態(tài)生成,如果用戶離開了會(huì)話并通過書簽或鏈接再次回來,會(huì)話的信息都會(huì)丟失,因?yàn)榇鎯?chǔ)下來的鏈接含有錯(cuò)誤的標(biāo)識(shí)信息-該URL后面的SESSION ID已經(jīng)過期了。
      
    *************************************************************************************
    十七、使用隱藏的表單域有什么缺點(diǎn)
    *************************************************************************************

         僅當(dāng)每個(gè)頁面都是有表單提交而動(dòng)態(tài)生成時(shí),才能使用這種方法。單擊常規(guī)的<A HREF..>超文本鏈接并不產(chǎn)生表單提交,因此隱藏的表單域不能支持通常的會(huì)話跟蹤,只能用于一系列特定的操作中,比如在線商店的結(jié)賬過程。

    *************************************************************************************
    十八、會(huì)話跟蹤的基本步驟
    *************************************************************************************

    1.訪問與當(dāng)前請(qǐng)求相關(guān)的會(huì)話對(duì)象
    2.查找與會(huì)話相關(guān)的信息
    3.存儲(chǔ)會(huì)話信息
    4.廢棄會(huì)話數(shù)據(jù)

    *************************************************************************************
    十九、getSession()/getSession(true)、getSession(false)的區(qū)別
    *************************************************************************************

    getSession()/getSession(true):當(dāng)session存在時(shí)返回該session,否則新建一個(gè)session并返回該對(duì)象
    getSession(false):當(dāng)session存在時(shí)返回該session,否則不會(huì)新建session,返回null。

    *************************************************************************************
    二十、如何將信息于會(huì)話關(guān)聯(lián)起來
    *************************************************************************************

      setAttribute方法會(huì)替換上次setAttribute中設(shè)定的值;如果想要在不提供任何代替的情況下移除某個(gè)值,則應(yīng)使用removeAttribute。這個(gè)方法會(huì)觸發(fā)所有實(shí)現(xiàn)了HttpSessionBindingListener接口的值的valueUnbound方法。

    *************************************************************************************
    二十一、會(huì)話屬性的類型有什么限制嗎
    *************************************************************************************

    通常會(huì)話屬性的類型只要是Object就可以了。除了null或基本類型,如int,double,boolean。如果要使用基本類型的值作為屬性,必須將其轉(zhuǎn)換為相應(yīng)的封裝類對(duì)象。

    *************************************************************************************
    二十二、如何廢棄會(huì)話數(shù)據(jù)
    *************************************************************************************
    A.只移除自己編寫的servlet創(chuàng)建的數(shù)據(jù):
        調(diào)用removeAttribute(“key”)將指定鍵關(guān)聯(lián)的值廢棄
    B.刪除整個(gè)會(huì)話(在當(dāng)前Web應(yīng)用中):
        調(diào)用invalidate,將整個(gè)會(huì)話廢棄掉。這樣做會(huì)丟失該用戶的所有會(huì)話數(shù)據(jù),而非僅僅由我們servlet或JSP頁面創(chuàng)建的會(huì)話數(shù)據(jù)
    C.將用戶從系統(tǒng)中注銷并刪除所有屬于他(或她)的會(huì)話
        調(diào)用logOut,將客戶從Web服務(wù)器中注銷,同時(shí)廢棄所有與該用戶相關(guān)聯(lián)的會(huì)話(每個(gè)Web應(yīng)用至多一個(gè))。這個(gè)操作有可能影響到服務(wù)器上多個(gè)不同的Web應(yīng)用。

    *************************************************************************************
    二十三、使用isNew來判斷用戶是否為新舊用戶的錯(cuò)誤做法
    *************************************************************************************

    public boolean isNew()方法如果會(huì)話尚未和客戶程序(瀏覽器)發(fā)生任何聯(lián)系,即服務(wù)器端程序還沒有返回客戶端時(shí),則這個(gè)方法返回true,這一般是因?yàn)闀?huì)話是新建的,不是由輸入的客戶請(qǐng)求所引起的。但如果isNew返回false,只不過是說明他之前曾經(jīng)訪問Web應(yīng)用,并不代表他們?cè)L問過我們的servlet或JSP頁面。

    因?yàn)閟ession是與用戶相關(guān)的,在用戶之前訪問的每一個(gè)頁面都有可能創(chuàng)建了會(huì)話。因此isNew為false只能說用戶之前訪問過該Web應(yīng)用,session可以是當(dāng)前頁面創(chuàng)建,也可能是由用戶之前訪問過的頁面創(chuàng)建的。正確的做法是判斷某個(gè)session中是否存在某個(gè)特定的key且其value是否正確。(待測(cè)試)

    *************************************************************************************
    二十四、Cookie的過期和Session的超時(shí)有什么區(qū)別
    *************************************************************************************

    會(huì)話的超時(shí)由服務(wù)器來維護(hù),它不同于Cookie的失效日期。

    首先,會(huì)話一般基于駐留內(nèi)存的cookie不是持續(xù)性的cookie,因而也就沒有截至日期。即使截取到JSESSIONID cookie,并為它設(shè)定一個(gè)失效日期發(fā)送出去。瀏覽器會(huì)話和服務(wù)器會(huì)話也會(huì)截然不同。

    *************************************************************************************
    二十五、session cookie和session對(duì)象的生命周期是一樣的嗎
    *************************************************************************************

    當(dāng)用戶關(guān)閉了瀏覽器雖然session cookie已經(jīng)消失,但session對(duì)象仍然保存在服務(wù)器端,直到其失效時(shí)間。

    *************************************************************************************
    二十六、是否只要關(guān)閉瀏覽器,session就消失了
    *************************************************************************************

    程序一般都是在用戶做log off的時(shí)候發(fā)個(gè)指令去刪除session,然而瀏覽器從來不會(huì)主動(dòng)在關(guān)閉之前通知服務(wù)器它將要被關(guān)閉,因此服務(wù)器根本不會(huì)有機(jī)會(huì)知道瀏覽器已經(jīng)關(guān)閉。服務(wù)器會(huì)一直保留這個(gè)會(huì)話對(duì)象直到它處于非活動(dòng)狀態(tài)超過設(shè)定的間隔為止。

    之所以會(huì)有這種錯(cuò)誤的認(rèn)識(shí),是因?yàn)榇蟛糠謘ession機(jī)制都使用會(huì)話cookie來保存session id,而關(guān)閉瀏覽器后這個(gè)session id就消失了,再次連接到服務(wù)器時(shí)也就無法找到原來的session。如果服務(wù)器設(shè)置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發(fā)出的HTTP請(qǐng)求報(bào)頭,把原來的session id發(fā)送到服務(wù)器,則再次打開瀏覽器仍然能夠找到原來的session。恰恰是由于關(guān)閉瀏覽器不會(huì)導(dǎo)致session被刪除,迫使服務(wù)器為session設(shè)置了一個(gè)失效時(shí)間,當(dāng)距離客戶上一次使用session的時(shí)間超過了這個(gè)失效時(shí)間時(shí),服務(wù)器就可以認(rèn)為客戶端已經(jīng)停止了活動(dòng),才會(huì)把session刪除以節(jié)省存儲(chǔ)空間。

    由此我們可以得出如下結(jié)論:
    關(guān)閉瀏覽器,只會(huì)是瀏覽器端內(nèi)存里的session cookie消失,但不會(huì)使保存在服務(wù)器端的session對(duì)象消失,同樣也不會(huì)使已經(jīng)保存到硬盤上的持久化cookie消失。


    補(bǔ)充:那如何做到在瀏覽器關(guān)閉時(shí)刪除session呢 ?

    嚴(yán)格的講,做不到這一點(diǎn)。可以做一點(diǎn)努力的辦法是在所有的客戶端頁面里使用javascript代碼window.oncolose來監(jiān)視瀏覽器的關(guān)閉動(dòng)作,然后向服務(wù)器發(fā)送一個(gè)請(qǐng)求來刪除session。但是對(duì)于瀏覽器崩潰或者強(qiáng)行殺死進(jìn)程這些非常規(guī)手段仍然無能為力。

    *************************************************************************************
    二十七、打開兩個(gè)瀏覽器窗口訪問應(yīng)用程序會(huì)使用同一個(gè)session還是不同的session
    *************************************************************************************

    通常session cookie是不能跨窗口使用的,當(dāng)你新開了一個(gè)新的瀏覽器窗口進(jìn)入相同頁面時(shí),系統(tǒng)會(huì)賦予你一個(gè)新的session id,這樣我們信息共享的目的就達(dá)不到了。對(duì)session來說是只認(rèn)id不認(rèn)人,因此不同的瀏覽器,不同的窗口打開方式以及不同的cookie存儲(chǔ)方式(如會(huì)話cookie和持久cookie)都會(huì)對(duì)這個(gè)問題的答案有影響。

    (在IE下測(cè)試,打開兩個(gè)瀏覽器(不是新建窗口,是直接啟動(dòng)兩次瀏覽器),得到的SessionID也是不一樣)

    要實(shí)現(xiàn)跨窗口的會(huì)話跟蹤,我們可以先把session id保存在persistent cookie中(通過設(shè)置session的最大有效時(shí)間),然后在新窗口中讀出來,就可以得到上一個(gè)窗口的session id了,這樣通過session cookie和persistent cookie的結(jié)合我們就可以實(shí)現(xiàn)了跨窗口的會(huì)話跟蹤。(待測(cè)試)

    *************************************************************************************
    二十八、如何使用會(huì)話顯示每個(gè)客戶的訪問次數(shù)
    *************************************************************************************

    由于客戶的訪問次數(shù)是一個(gè)整型的變量,但session的屬性類型中不能使用int,double,boolean等基本類型的變量,所以我們要用到這些基本類型的封裝類型對(duì)象作為session對(duì)象中屬性的值.

    但像Integer是一種不可修改(Immutable)的數(shù)據(jù)結(jié)構(gòu):構(gòu)建后就不能更改。這意味著每個(gè)請(qǐng)求都必須創(chuàng)建新的Integer對(duì)象,之后使用setAttribute來覆蓋之前存在的老的屬性的值。例如:

    Integer value = (Integer)request.getSession().getAttribute("cout");
    if (value == null){
         value 
    = new CountClass(…); // 新創(chuàng)建一個(gè)不可更改對(duì)象
    }
    else{
         value 
    = new CountClass(calculated(value)); // 對(duì)value重新計(jì)算后創(chuàng)建新的對(duì)象
    }

    request.getSession().setAttribute(
    "cout",value);// 使用新創(chuàng)建的對(duì)象覆蓋原來的老的對(duì)象



    *************************************************************************************
    二十九、如何使用會(huì)話累計(jì)用戶的數(shù)據(jù)
    *************************************************************************************

    使用可變的數(shù)據(jù)結(jié)構(gòu),比如數(shù)組、List、Map或含有可寫字段的應(yīng)用程序?qū)S械臄?shù)據(jù)結(jié)構(gòu)。通過這種方式,除非首次分配對(duì)象,否則不需要調(diào)用setAttribute。例如:

    List list_check = (List) request.getSession().getAttribute("ids_go");
    if(list_check = = null){
         list_check 
    = new List();
         request.getSession().setAttribute((
    "ids_go",list_check );
    }
    else{
          list_check .clear();
    // 如果已經(jīng)存在該對(duì)象則更新其屬性而不需重新設(shè)置屬性
    }

    List list_check1 
    = (List) request.getSession().getAttribute("ids_go");
    System.out.println(list_check1.size());
    //此時(shí)size為0



    *************************************************************************************
    三十、不可更改對(duì)象和可更改對(duì)象在會(huì)話數(shù)據(jù)更新時(shí)的不同處理
    *************************************************************************************

    不可更改對(duì)象因?yàn)橐坏﹦?chuàng)建之后就不能更改,所以每次要修改會(huì)話中屬性的值的時(shí)候,都需要調(diào)用setAttribute(“someIdentifier”,newValue)來代替原有的屬性的值,否則屬性的值不會(huì)被更新。

    可更改對(duì)象因?yàn)槠渥陨硪话闾峁┝诵薷淖陨韺傩缘姆椒ǎ悦看我薷臅?huì)話中屬性的值的時(shí)候,只要調(diào)用該可更改對(duì)象的相關(guān)修改自身屬性的方法就可以了,這意味著我們就不需要調(diào)用setAttribute方法了。


    總結(jié)

    session機(jī)制本身并不復(fù)雜,然而其實(shí)現(xiàn)和配置上的靈活性卻使得具體情況復(fù)雜多變。這也要求我們不能把僅僅某一次的經(jīng)驗(yàn)或者某一個(gè)瀏覽器,服務(wù)器的經(jīng)驗(yàn)當(dāng)作普遍適用的。


     

    posted on 2007-05-26 13:45 cheng 閱讀(40885) 評(píng)論(30)  編輯  收藏 所屬分類: JSP/Servlet

    FeedBack:
    # re: 對(duì)session和cookie的一些理解[未登錄]
    2007-05-27 10:33 | andyelvis
    我也想問一個(gè)關(guān)于session的問題:
    比如在一個(gè)購物網(wǎng)站,一個(gè)合法用戶已經(jīng)登錄,并選購了一些商品放在購物車?yán)铮@時(shí)他離開了一下,另一個(gè)也是合法用戶從剛離開的用戶的當(dāng)前頁面進(jìn)入登錄頁面然后登錄,也就是說此時(shí)這兩個(gè)用戶共用了一個(gè)session,那這時(shí)如何區(qū)分這兩個(gè)用戶呢?  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2007-05-27 17:11 | cheng
    這為朋友的問題我想可以理解為同一用戶多個(gè)帳號(hào),換帳號(hào)登陸時(shí)出現(xiàn)的購物車清單共享同一個(gè)的情況了!

    我考慮了,但是這樣的話,你的需求就是想實(shí)現(xiàn)的在同一瀏覽器窗口中實(shí)現(xiàn)多個(gè)session的創(chuàng)建了,可是一個(gè)瀏覽器只對(duì)應(yīng)一個(gè)sessionId呢,用會(huì)話cookie的話是沒辦法做到這一點(diǎn)的吧.

    當(dāng)然有知道解決方案的朋友可以提出你們的建議了!  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2007-05-27 17:20 | cheng
    不知道這樣行不,就是當(dāng)用戶A登陸后,點(diǎn)擊到購物清單頁面時(shí),當(dāng)用戶B在A的此頁面上點(diǎn)擊登陸鏈接進(jìn)入登陸頁面時(shí).
    用javascript來實(shí)現(xiàn)下面功能:

    在本清單頁面,另外重新打開一個(gè)新的登陸頁面,讓用戶B來進(jìn)行登陸!不過這樣感覺不是很友好了:P  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解[未登錄]
    2007-05-27 18:33 | andyelvis
    謝謝你的回答。我其實(shí)是看了你的文章后突然想到這種情況的,既然一個(gè)瀏覽器只能對(duì)應(yīng)一個(gè)sessionId,那當(dāng)后來的那個(gè)用戶登錄時(shí),系統(tǒng)取出session中已有的用戶名與此登錄用戶名比較不匹配時(shí),從系統(tǒng)安全性來講,是不是應(yīng)該使原來的session失效更好呢?  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解[未登錄]
    2007-05-27 21:53 | cheng
    失效也可以,如果要保證用戶B登陸后用戶A的信息清單也在的話,好象在同一個(gè)窗口中不能做到這點(diǎn)的吧.

    如果是讓用戶B登陸進(jìn)入系統(tǒng)后,讓用戶A的session值銷毀的話是可以實(shí)現(xiàn)的!

    個(gè)人感覺session這一塊有很多細(xì)節(jié)需要去思考,這幾天一直在想這個(gè)問題,今天在調(diào)試struts的代碼時(shí),碰到了一個(gè)問題,感覺和用servlet代碼調(diào)試的結(jié)果不一樣.
    流程是這樣的:index.do---->IndexAction---->login.jsp---login.do---->ListAction--->list.jsp

    我將login.jsp中的session開啟設(shè)置為false關(guān)閉,同時(shí)在IndexAction中根本沒有去創(chuàng)建session對(duì)象,就是一個(gè)直接的跳轉(zhuǎn)到login.jsp,但是我debud跟蹤的時(shí)候發(fā)現(xiàn),用struts框架調(diào)試的時(shí)候,當(dāng)轉(zhuǎn)到login.jsp后點(diǎn)擊上面的提交按鈕進(jìn)入ListAction后,我用Cookie cookie = request.getCookies();此時(shí)cookie理論上應(yīng)該是為null(我寫servlet類來測(cè)試時(shí)是這樣的),但在struts中卻有值,所以我就想,是不是struts框架的ActionServlet類中是不是已經(jīng)有HttpSession sess =request.getSession();這樣的代碼,后來找了struts的書籍查了下ActionServlet中的源代碼,果真有!

    所以我就想在index.do進(jìn)入我們自己寫的IndexAction之前經(jīng)過struts的ActionServlet類時(shí)就創(chuàng)建了session,所以到轉(zhuǎn)向login.jsp,最后將login.jsp返回給客戶端的時(shí)候就將ActionServlet創(chuàng)建的session的sessionId已經(jīng)用會(huì)話cookie傳給客戶端瀏覽器的內(nèi)存中了,所以在通過提交按鈕在login.jsp上點(diǎn)擊時(shí)到ListAction中時(shí),自然而然,通過reque4st.getCookies()就有獲得值了,并且這個(gè)值(sessionId是之前在ActionServlet中生成的session對(duì)象的sessionId)了.

    但進(jìn)一步我還要去調(diào)試跟蹤,要是對(duì)struts框架中的session對(duì)象的創(chuàng)建有過研究的朋友可以給我一些理解和建議,誠心請(qǐng)教,學(xué)習(xí)!!!  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2007-06-02 15:26 | 張寧
    你寫的挺好,謝謝你了  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2007-06-16 21:37 | 阿勇
    受教了  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2007-12-07 14:37 | blue Sky
    感動(dòng)啊!!  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解[未登錄]
    2008-01-14 23:11 |
    你好,關(guān)于不同窗口共享session的問題,
    我在一個(gè)日文文章中看到,別人做了一些試驗(yàn),
    既然打開不同的IE,session共享有存在。
    試驗(yàn)結(jié)果,這與系統(tǒng)版本,好像筆記本和臺(tái)式機(jī)
    也有些區(qū)別。如果這方面有好的見解,請(qǐng)聯(lián)系!
    lyl2000610@yahoo.com.cn  回復(fù)  更多評(píng)論
      
    # 如何 刪除某個(gè) session[未登錄]
    2008-02-01 09:13 | sky
    請(qǐng)教一個(gè)問題:

    在服務(wù)器端,想做個(gè)session 管理的處理

    現(xiàn)能監(jiān)聽得到所用 session ID ,是否可以做到人為的刪除某個(gè) session

      回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2008-06-18 17:29 | zhanglei
    真的很謝謝你。你的這篇文章對(duì)我太有用了  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2011-08-22 16:03 | andylau
    request,response  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2011-10-07 12:32 | 張志強(qiáng)
    但法國人個(gè)人共同如果突然該不該他和她以后 如通過認(rèn)購?fù)ㄟ^如果熱歌如果熱個(gè)人個(gè)人法國人太過投入如果人生觀  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2012-02-10 09:35 | Return
    受益匪淺,非常感謝  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2012-03-05 10:16 | jessiecc
    總結(jié)挺好的,謝謝  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2012-11-19 17:37 | 游客
    真心不錯(cuò)  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2012-12-13 11:31 | xiyouyxyh
    寫的真好. 分享了。  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2013-03-12 19:58 | backtonever
    奇怪收藏老讓注冊(cè) 我注冊(cè)了博客園的  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2013-04-23 12:02 | 再重新選擇
    想再重新在操作  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2013-08-19 00:00 | 馬先生
    這個(gè)是線程的問題。兩個(gè)用戶肯定是兩個(gè)線程了,怎么回同一個(gè)session呢  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2013-09-04 23:55 | 夏先生
    怎么收藏不了呀?  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解[未登錄]
    2013-10-21 13:04 | Daniel
    服務(wù)器自動(dòng)創(chuàng)建一個(gè)cookie并將jsessionId作為key,sessionId的值作為value發(fā)送到客戶端瀏覽器內(nèi)存中

    求教樓主,jsessionId是什么哦?   回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2013-11-09 18:55 | cheng
    筆誤,不好意思,是sessionid。  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2013-11-18 21:56 | dellme99
    總結(jié)的很好。 感動(dòng)中。 不過貌似沒有提及session的安全問題, 譬如sessionid的加密,隨機(jī)分配,agent信息的核對(duì)等。  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解[未登錄]
    2013-12-23 10:44 | Joe
    我是用php寫的 樓主說的第九條不是很理解啊?能說得清楚些嗎? 謝謝分享。  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2014-02-10 03:07 | 強(qiáng)強(qiáng)貓
    哈,雖然我是用ASP.NET的,但是原理基本一樣,也受益匪淺  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2014-04-17 10:10 | 起床困難戶
    比我們老師講的都要好。  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解
    2014-08-17 14:12 | sss
    怎么用session和cookie來訪問共享用戶信息  回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解[未登錄]
    2014-09-26 11:45 | 龍龍
    這是兩個(gè)不同用戶,session不能共享啊,@andyelvis
      回復(fù)  更多評(píng)論
      
    # re: 對(duì)session和cookie的一些理解[未登錄]
    2015-12-20 14:50 | jacky
    session不能共享!!!!!!!!!!!!!  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 久久免费的精品国产V∧| 国产精品免费看久久久无码| 亚洲一区二区三区无码影院| 亚洲人妖女同在线播放| a级成人毛片免费图片| 免费a级毛片网站| 亚洲色欲色欲www| 久久精品视频免费播放| 亚洲成?Ⅴ人在线观看无码| 亚洲AV无码成人专区| 久久精品视频免费看| 亚洲一区爱区精品无码| 青青免费在线视频| 成人无遮挡毛片免费看| 亚洲激情视频网站| 国产精品免费一区二区三区四区| 亚洲午夜国产片在线观看| 久久综合亚洲色hezyo| 国产一卡2卡3卡4卡无卡免费视频| 久久亚洲伊人中字综合精品| 国产黄色免费观看| 国产一区二区三区免费在线观看 | 午夜影视日本亚洲欧洲精品一区| 免费手机在线看片| 卡1卡2卡3卡4卡5免费视频| 亚洲噜噜噜噜噜影院在线播放| 另类免费视频一区二区在线观看| 精品亚洲成α人无码成α在线观看 | 浮力影院第一页小视频国产在线观看免费 | 国产成人aaa在线视频免费观看| 亚洲精品国产国语| 亚洲天堂免费在线| 亚洲最大的视频网站| 最近2022中文字幕免费视频| 亚洲AV综合色区无码另类小说| 久久久免费观成人影院| 亚洲真人日本在线| 丰满少妇作爱视频免费观看| 亚洲女人被黑人巨大进入| 农村寡妇一级毛片免费看视频 | 国产亚洲视频在线|