一、Cookie的過期和Session的超時有什么區別?
會話的超時由服務器來維護,它不同於Cookie的失效日期。首先,會話一般基於駐留內存的cookie
不是持續性的cookie,因而也就沒有截至日期。即使截取到JSESSIONID cookie,並為它設定一個失效日期發送出去。瀏覽器會話和服務器會話也會截然不同。
二、session cookie和session對象的生命周期是一樣的嗎?
當用戶關閉了瀏覽器雖然session cookie已經消失,但session對象仍然保存在服務器端
三、是否只要關閉瀏覽器,session就消失了?
程序一般都是在用戶做log off的時候發個指令去刪除session,然而瀏覽器從來不會主動在關閉之前通知服務器它將要被關閉,因此服務器根本不會有機會知道瀏覽器已經關閉。
服務器會一直保留這個會話對象直到它處於非活動狀態超過設定的間隔為止。
之所以會有這種錯誤的認識,是因為大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器后這個session id就消失了,再次連接到服務器時也就無法找到原來的session。
如果服務器設置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發出的HTTP請求報頭,把原來的session id發送到服務器,則再次打開瀏覽器仍然能夠找到原來的session。
恰恰是由於關閉瀏覽器不會導致session被刪除,迫使服務器為session設置了一個失效時間,當距離客戶上一次使用session的時間超過了這個失效時間時,服務器就可以認為客戶端已經停止了活動,才會把session刪除以節省存儲空間。
<system.web> <sessionState mode="InProc" cookieless="false" timeout="50"/> </system.web>
由此我們可以得出如下結論:
關閉瀏覽器,只會是瀏覽器端內存里的session cookie消失,但不會使保存在服務器端的session對象消失,同樣也不會使已經保存到硬盤上的持久化cookie消失。
四、如何使用會話(session)顯示每個客戶的訪問次數?
由於客戶的訪問次數是一個整型的變量,但session的屬性類型中不能使用int,double,boolean等基本類型的變量,所以我們要用到這些基本類型的封裝類型對象作為session對象中屬性的值。
但像Integer是一種不可修改(Immutable)的數據結構:構建后就不能更改。這意味着每個請求都必須創建新的Integer對象,之后使用setAttribute來代替之前存在的老的屬性的值。
例如:
HttpSession session = request.getSession(); SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”); if (value= =null){ value = new SomeImmutableClass(…); // 新創建一個不可更改對象 }else{ value = new SomeImmutableClass(calculatedFrom(value)); // 對value重新計算后創建新的對象 } session.setAttribute(“someIdentifier”,value); // 使用新創建的對象覆蓋原來的老的對象
使用可變的數據結構,比如數組、List、Map或含有可寫字段的應用程序專有的數據結構。通過這種方式,除非首次分配對象,否則不需要調用setAttribute。