HttpSession的工做原理及相關常見問題

如下以session簡稱:
一、session的生命週期:session是在服務器第一次執行getSession()語句時才建立的(此方法:服務器先從瀏覽器帶來的cookie中查找JSESSIONID,是否有相關可用的session,有就調用,若是沒有,再從超連接的URL中查找
JSESSIONID,若是尚未,就會建立一個新的session。),若是session對象30分鐘內沒有被訪問,服務器將自動銷燬該session.
另外,
能夠經過web.xml文件配置session的失效時間,單位爲分鐘
<seesion-config>
    <session-timeout>10</session-timeout>
</seesion-config>
能夠經過session.invalidate()方法來銷燬session對象。


二、session的建立是基於cookie的,服務器在新建立session的時候,會自動爲session設置一個ID信息,並以cookie的形式回寫給瀏覽器,JSESSIONID=IDNumber,IDNumber是服務器自動生成的惟一的編碼;當瀏覽器訪問別的頁面的時候,自動會帶着該cookie信息,這樣服務器會自動調用已生成的session,而不會從新建立session對象,或調用錯誤的session

三、服務器建立session對象時,生成的cookie是沒有指定生存時間的,因此當瀏覽器意外關閉的時候,相應的cookie會隨之銷燬,這樣用戶再次訪問相應的頁面時,
上次保存的session對象也就找不到了,服務器會再次建立一個新的session對象。這種狀況會形成:用戶在瀏覽器意外關閉前,全部保存在session中的操做信息也隨之丟失。    
    這樣用戶體驗會至關很差,爲了不出現這種狀況,咱們須要將保存session對象ID信息的cookie設置一個生存時間,這樣瀏覽器意外關閉的時候,cookie不會隨之銷燬,這樣就保證了,用戶在瀏覽器意外關閉後再次訪問頁面時,能夠繼續以前的相應操做。
方法:
一、先獲取服務器新建立的session的ID
二、實例化一個與服務器回寫給瀏覽器同樣的cookie,以保存此ID信息
三、指定cookie可見的目錄,要與服務器默認的相同,默認爲相應的web應用

四、設置cookie的生存時間(最好是30分鐘之內)
五、將此cookie回寫給瀏覽器
實現代碼:
HttpSession session = request.getSession();
String sessionid = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionid);
cookie.setPath("/webappName");//這裏的path要替換成實際須要用的 
cookie.setMaxAge(30*60);
response.addCookie(cookie);
四、咱們知道了session對象是基於cookie的,若是用戶使用的瀏覽器把cookie禁用了,那麼session將會失效。
解決此類問題的方法是:使用URL重寫,即將全部涉及到的URL信息中加入session的ID屬性JSESSIONID。

實現代碼:
String newURL = response.encodeURL("odlURL")
對odlURL進行重寫,返回的newURL中包含了session的ID值。

newURL的形式是:
若是odlURL中帶有參數,則在?前加上
;JSESSIONID=IDNumber     
格式爲:
——;JSESSIONID=IDNumber?——
若是oldURL中沒有參數,則直接是oldURL;
JSESSIONID=IDNumber

encodeURL(String url)方法的一個實現細節:該方法執行的時候,服務器會判斷瀏覽器是否帶有JSESSIONID相關的cookie,若是有就不會再進行URL重寫,若是沒有就會進行URL重寫。
    咱們知道該方法是爲了解決那些禁用或不支持cookie的瀏覽器出現的相關問題。那麼對於支持cookie並且沒有禁用cookie的狀況下,咱們仍使用URL重寫的時候,會出現的狀況:第一次訪問的時候瀏覽器是沒有帶着JSESSIONID的相關cookie的,因此會進行URL重寫,在此同時服務器把session的相關cookie信息回寫給了瀏覽器,第二次再訪問的時候瀏覽器帶有
JSESSIONID的相關cookie,因此就不會再進行URL重寫了。


注:對於那些禁用或不支持cookie的瀏覽器,經過URL重寫後,當瀏覽器意外關閉面出現的session丟失的問題,是沒法解決的!!!

 
對於健壯的會話跟蹤,servlet 發出的全部 URL 都應該經過此方法運行。不然,session不能用於不支持 cookie 的瀏覽器。
相關文章
相關標籤/搜索