HttpSession的工作原理及相關常見問題
以下以session簡稱:
1、session的生命周期:session是在服務器第一次執行getSession()語句時才創建的(此方法:服務器先從瀏覽器帶來的cookie中查找JSESSIONID,是否有相關可用的session,有就調用,如果沒有,再從超鏈接的URL中查找 JSESSIONID,如果還沒有,就會創建一個新的session。),如果session對象30分鐘內沒有被訪問,服務器將自動銷毀該session.
另外,
可以通過web.xml文件配置session的失效時間,單位為分鐘
2、session的創建是基于cookie的,服務器在新創建session的時候,會自動為session設置一個ID信息,并以cookie的形式回寫給瀏覽器,JSESSIONID=IDNumber,IDNumber是服務器自動生成的唯一的編碼;當瀏覽器訪問別的頁面的時候,自動會帶著該cookie信息,這樣服務器會自動調用已生成的session,而不會重新創建session對象,或調用錯誤的session
3、服務器創建session對象時,生成的cookie是沒有指定生存時間的,所以當瀏覽器意外關閉的時候,相應的cookie會隨之銷毀,這樣用戶再次訪問相應的頁面時,上次保存的session對象也就找不到了,服務器會再次創建一個新的session對象。這種情況會造成:用戶在瀏覽器意外關閉前,所有保存在session中的操作信息也隨之丟失。
這樣用戶體驗會相當不好,為了避免出現這種情況,我們需要將保存session對象ID信息的cookie設置一個生存時間,這樣瀏覽器意外關閉的時候,cookie不會隨之銷毀,這樣就保證了,用戶在瀏覽器意外關閉后再次訪問頁面時,可以繼續之前的相應操作。
方法:
1、先獲取服務器新創建的session的ID
2、實例化一個與服務器回寫給瀏覽器一樣的cookie,以保存此ID信息
3、指定cookie可見的目錄,要與服務器默認的相同,默認為相應的web應用
4、設置cookie的生存時間(最好是30分鐘以內)
5、將此cookie回寫給瀏覽器
實現代碼:
解決此類問題的方法是:使用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 的瀏覽器。
另外,
可以通過web.xml文件配置session的失效時間,單位為分鐘
<seesion-config> <session-timeout>10</session-timeout> </seesion-config>可以通過session.invalidate()方法來銷毀session對象。
2、session的創建是基于cookie的,服務器在新創建session的時候,會自動為session設置一個ID信息,并以cookie的形式回寫給瀏覽器,JSESSIONID=IDNumber,IDNumber是服務器自動生成的唯一的編碼;當瀏覽器訪問別的頁面的時候,自動會帶著該cookie信息,這樣服務器會自動調用已生成的session,而不會重新創建session對象,或調用錯誤的session
3、服務器創建session對象時,生成的cookie是沒有指定生存時間的,所以當瀏覽器意外關閉的時候,相應的cookie會隨之銷毀,這樣用戶再次訪問相應的頁面時,上次保存的session對象也就找不到了,服務器會再次創建一個新的session對象。這種情況會造成:用戶在瀏覽器意外關閉前,所有保存在session中的操作信息也隨之丟失。
這樣用戶體驗會相當不好,為了避免出現這種情況,我們需要將保存session對象ID信息的cookie設置一個生存時間,這樣瀏覽器意外關閉的時候,cookie不會隨之銷毀,這樣就保證了,用戶在瀏覽器意外關閉后再次訪問頁面時,可以繼續之前的相應操作。
方法:
1、先獲取服務器新創建的session的ID
2、實例化一個與服務器回寫給瀏覽器一樣的cookie,以保存此ID信息
3、指定cookie可見的目錄,要與服務器默認的相同,默認為相應的web應用
4、設置cookie的生存時間(最好是30分鐘以內)
5、將此cookie回寫給瀏覽器
實現代碼:
HttpSession session = request.getSession(); String sessionid = session.getId(); Cookie cookie = new Cookie("JSESSIONID", sessionid); cookie.setPath("path"); cookie.setMaxAge(30*60); response.addCookie(cookie);4、我們知道了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 的瀏覽器。
本文由用戶 f663x 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!