重新認識Session(續) 自己動手做試驗

2021-08-29 08:34:30 字數 4680 閱讀 7469

我們可以設計乙個servlet,來看一看session到底是怎麼工作的。

在servlet中,可以設計這樣的**:

//列印出sessionid,用來判斷session是否新建

//列印出請求報頭中的內容

enumeration enu_req_headers = request.getheadernames();  

while(enu_req_headers.hasmoreelements())   

else   

}  //響應中是否含有set-cookie,瀏覽器的下次提交將會受此影響

boolean containcookie = response.containsheader("set-cookie");  

system.out.println("::if the response contain header:set-cookie? : "+containcookie);  

//判斷此session是否是新建立的

system.out.println("::if the session is new : " + request.getsession().isnew());  

system.out.println();  

來檢視session的工作情況。

1、session是在何種情況下建立的?

::session id is : 42de852fbd9e23c5ca5e06e883d6f466  

accept  

accept-language  

accept-encoding  

user-agent  

host  

connection  

::if the response contain header:set-cookie? : true

::if the session is new : true

注意到,在請求報頭中,沒有cookie的內容。但在response響應中,有set-cookie的要求,這將影響到下一次瀏覽器的請求。

重新整理一下,得到的輸出為:

::session id is : 42de852fbd9e23c5ca5e06e883d6f466  

accept  

accept-language  

accept-encoding  

user-agent  

host  

connection  

::cookie : jsessionid=42de852fbd9e23c5ca5e06e883d6f466  

::if the response contain header:set-cookie? : false

::if the session is new : false

可以看到,瀏覽器向伺服器提交了cookie,使用的是原來的session。由於這裡並沒有新建session,因此也沒有了set-cookie的要求。

關閉瀏覽器的接受cookie功能,重啟瀏覽器,並重新整理一次頁面,可以得到以下輸出:

::session id is : 5bf9763193e7e6faf959b4224ed18977  

accept  

accept-language  

accept-encoding  

user-agent  

host  

connection  

::if the response contain header:set-cookie? : true

::if the session is new : true

::session id is : eb216e0fe7fad5caf9c6a472f0d72195  

accept  

accept-language  

accept-encoding  

user-agent  

host  

connection  

::if the response contain header:set-cookie? : true

::if the session is new : true

可以看到,每次的請求都會建立乙個session,並且每次都會有set-cookie的要求。

我在位址列的位址後面加上 ;jsessionid=

eb216e0fe7fad5caf9c6a472f0d72195,再次重新整理頁面,可以看到這樣的輸出:

::session id is : eb216e0fe7fad5caf9c6a472f0d72195  

accept  

accept-language  

accept-encoding  

user-agent  

host  

connection  

::if the response contain header:set-cookie? : false

::if the session is new : false

可以看到,沒有新建session,也沒有set-cookie的要求。這裡就是使用url重寫來實現的會話跟蹤。但若

jsessionid的值在現有session中找不到,servlet容器還是會建立乙個新的session。

現在,將瀏覽器的接收cookie功能開啟,驗證最後乙個特徵。

先重啟一下瀏覽器,重新整理一下,得到的輸出如下:

::session id is : 8dab8217cc9eb70bd0194d4e76c2a805  

accept  

accept-language  

accept-encoding  

user-agent  

host  

connection  

::if the response contain header:set-cookie? : true

::if the session is new : true

::session id is : 8dab8217cc9eb70bd0194d4e76c2a805  

accept  

accept-language  

accept-encoding  

user-agent  

host  

connection  

::cookie : jsessionid=8dab8217cc9eb70bd0194d4e76c2a805  

::if the response contain header:set-cookie? : false

::if the session is new : false

現在,重啟伺服器,但不要關閉瀏覽器。待伺服器重啟完畢,再重新整理一下頁面,可以看到這樣的輸出:

::session id is : 8dab8217cc9eb70bd0194d4e76c2a805  

accept  

accept-language  

accept-encoding  

user-agent  

host  

connection  

::cookie : jsessionid=8dab8217cc9eb70bd0194d4e76c2a805  

::if the response contain header:set-cookie? : false

::if the session is new : false

怎麼還是用的先前那個session?這個session在伺服器重啟時候就應該沒有了啊。

根據以上這些輸出,可以得知,在tomcat中,建立

session

的規律:

1、建立session的時候會附帶著建立乙個cookie,它的maxage為-1,也就是說只能存在於記憶體中。當瀏覽器端禁用cookie時,這個cookie依然會被建立。

2、當瀏覽器提交的請求中有jsessionid引數或cookie報頭時,容器不再新建session,而只是找到先前的session進行關聯。這裡又分為兩種情況:

1)使用jsessionid。該值若能與現有的session對應,就不建立新的session,否則,仍然建立新的session。

2)使用cookie。該值若能與現有的session對應,也不建立新的session;但若沒有session與之對應(就如上面的重啟伺服器之後)容器會根據cookie資訊恢復這個與之對應的session,就好像是以前有過一樣。

2、session何時被銷毀?

當我們關閉瀏覽器,再開啟它,連線伺服器時,伺服器端會分配乙個新的session,也就是說會啟動乙個新的會話。那麼原來的session是不是被銷毀了呢?

通過實現乙個sessionlistener可以發現,當瀏覽器關閉時,原session並沒有被銷毀(destory方法沒有執行),而是等到timeout到期,才銷毀這個session。關閉瀏覽器只是在客戶端的記憶體中清除了與原會話相關的cookie,再次開啟瀏覽器進行連線時,瀏覽器無法傳送cookie資訊,所以伺服器會認為是乙個新的會話。因此,如果有某些與session關聯的資源想在關閉瀏覽器時就進行清理(如臨時檔案等),那麼應該傳送特定的請求到伺服器端,而不是等到session的自動清理。

重新認識container

我還清楚的記得,第一次從 那兒聽說container這個詞 結果他給我解釋了半天還是似懂非懂的。今天,偷閒翻了下posa4,發現裡面對container的解釋特別清楚。粗略的理解下來是,為了分離關注點,而實現的對系統資源的封裝。豁然開朗的發現,os就是應用程式的container。突發奇想的,開發乙...

重新認識測試

以前總覺得測試是軟體開發的邊緣職位,開發人員才是軟體生命週期的核心人員。隨著對網際網路公司的了解,逐步了解到測試的重要性。以bat為例,三家公司均設定了測試開發工程師崗位,該崗位的主要職責就是編寫自動化測試案例,通過對 的邏輯進行分析,設計出能夠覆蓋大部分 的測試用例。如阿里的測試開發工程師的崗位描...

重新認識ARC

雖然用了很久的arc,感受了 簡潔。但是對arc底層實現並不了解。今天抽空研究了下,做些簡單地總結。一 strong 1.區域性變數 對於區域性變數來說,在超出作用域的地方由編譯器自動插入release。大概轉化為 在非arc返回的autorelease型別的方法 在blog手碼大概 如有錯誤還望指...