session超時和cookie過時

1、Cookie的過時和Session的超時有什麼區別?
 
會話的超時由服務器來維護,它不一樣於Cookie的失效日期。首先,會話通常基於駐留內存的cookie
不是持續性的cookie,於是也就沒有截至日期。即便截取到JSESSIONID cookie,併爲它設定一個失效日期發送出去。瀏覽器會話和服務器會話也會大相徑庭。
 
2、session cookie和session對象的生命週期是同樣的嗎?
 
當用戶關閉了瀏覽器雖然session cookie已經消失,但session對象仍然保存在服務器端
 
3、是否只要關閉瀏覽器,session就消失了?
 
程序通常都是在用戶作log off的時候發個指令去刪除session,然而瀏覽器歷來不會主動在關閉以前通知服務器它將要被關閉,所以服務器根本不會有機會知道瀏覽器已經關閉。
 
服務器會一直保留這個會話對象直到它處於非活動狀態超過設定的間隔爲止。
之因此會有這種錯誤的認識,是由於大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器後這個session id就消失了,再次鏈接到服務器時也就沒法找到原來的session。
 
若是服務器設置的cookie被保存到硬盤上,或者使用某種手段改寫瀏覽器發出的HTTP請求報頭,把原來的session id發送到服務器,則再次打開瀏覽器仍然可以找到原來的session。
 
偏偏是因爲關閉瀏覽器不會致使session被刪除,迫使服務器爲session設置了一個失效時間,當距離客戶上一次使用session的時間超過了這個失效時間時,服務器就能夠認爲客戶端已經中止了活動,纔會把session刪除以節省存儲空間。web

<system.web>
<sessionState mode="InProc" cookieless="false" timeout="50"/>
</system.web>


由此咱們能夠得出以下結論:
關閉瀏覽器,只會是瀏覽器端內存裏的session cookie消失,但不會使保存在服務器端的session對象消失,一樣也不會使已經保存到硬盤上的持久化cookie消失。
 
4、如何使用會話(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。瀏覽器

相關文章
相關標籤/搜索