會話的概述

什麼是會話

簡單的理解:用戶打開瀏覽器,點擊多個超連接,訪問Web服務器上多個資源,而後關閉瀏覽器,整個過程稱之爲一次會話。java

須要解決的問題

每一個用戶在使用瀏覽器與服務器會話的過程當中,會產生一些用戶數據,如用戶登錄標記,WEB應用程序必需要爲每一個用戶在一次或屢次會話過程當中保存這些數據。web

兩種技術

  • Cookie
    Cookie是客戶端技術,WEB應用程序把每一個用戶數據以Cookie的形式發送給各自的的瀏覽器,當用戶使用瀏覽器再次訪問WEB應用時,就會帶上這些Cookie,這樣,WEB應用能夠爲每一個用戶分別處理各自的數據了。
  • HttpSession
    簡稱Session,是服務器端技術,服務器在運行時爲每一個用戶的瀏覽器建立一個其獨享的HttpSession對象。因爲用戶各自獨享session,因此能夠把各自的數據存放在各自的session域中,當用戶去訪問當前web應用其餘web資源時,其餘web資源再從用戶各自的session中取出數據爲其服務。數組

    Cookie類

    一、javax.servlet.http.Cookie
    Cookie的屬性:瀏覽器

  • name:必須的,Cookie名緩存

  • value:必須的,Cookie名對應的數據
  • comment:可選,備註
  • path:默認值就是產生Cookie的Servlet對應的URI

有一個cookie它的路徑是:/app/servlet/
當瀏覽器訪問的新資源的路徑是:/app/1.jsp
問?瀏覽器會將該cookie帶給1.jsp嗎?不會服務器

當瀏覽器訪問的新資源的路徑是:/app/servlet/a/b/ServletDemo1
問?瀏覽器會將該cookie帶給ServletDemo1嗎?

總結:在訪問一個資源時,帶不帶已有的cookie。訪問的資源路徑.startsWith(cookie的path),若是爲true,則會帶cookie

若是把一個Cookie的path設置成了/app/,說明訪問/app/下面的任何資源,都會帶cookie過去。session

  • domain:默認就是產生Cookie的Servlet所在的網站域名併發

    加入cookie的domain是www.baidu.com
    訪問http://www.163.com帶不帶?不帶app

  • maxAge:標識cookie的生命週期。默認是一次會話

要想在客戶端的緩存中保存住Cookie的數據,增大它的存活時間。單位是秒
若是取值爲0,就是要刪除之。

  • version:可選,Cookie的版本

二、服務器向客戶端寫Cookie
response.addCookie(Cookie cookie);對應設置響應頭的「Set-Cookie」

三、獲取客戶端提交過來的Cookie
Cookie[] cookies = request.getCookies();接着遍歷cookies數組肯定所需的Cookie

四、如何惟一肯定一個Cookie(有同名Cookie狀況)
經過domain+path+name,能夠肯定惟一一個Cookie

五、其餘

  • 一個WEB站點能夠給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器能夠存儲多個WEB站點提供的Cookie
  • 瀏覽器通常只容許存放300個cookies,每一個站點最多存放20個Cookie,每一個Cookie的大小限制爲4KB
  • 若是建立一個Cookie,併發送到瀏覽器,默認狀況是一個會話級別的cookie,即只存在瀏覽器的內存中。若須要存儲在磁盤上則須要設置maxAge屬性爲大於0的數值,單位爲秒。爲0則是告訴瀏覽器刪除該cookie。
  • 刪除cookie時,path必須一致,不然刪除不成功

HttpSession類

javax.servlet.http.HttpSession HttpSession技術實際上仍是利用Cookie技術

一、得到HttpSession對象:

HttpSession session = request.getSession();

每個HttpSession對象都有一個惟一的ID
爲了標識每個客戶端,實際上向客戶端寫了一個特殊的Cookie:

  • 該Cookie的name爲固定的「JSESSIONID」
  • 該Cookie的value爲HttpSession對象的id
  • 該Cookie的path爲當前應用路徑

request.getSession()方法詳解:

  • 若是用戶帶着一個名稱叫作JSESSIONID的Cookie過來了,先按照ID到服務器內存中找對應的HttpSession對象,
  • 沒找到或者瀏覽器沒有帶,則建立一個新的HttpSession對象,亦即有了新的ID,同時寫給客戶端JSESSION=sessionid;
  • 若是找到了,返回該HttpSession對象,繼續爲用戶服務。

request.getSession(boolean b):若是b爲true,做用等同於request.getSession()。 若是b爲false,做用只是獲取。找不到則返回null。

session.invalidate():馬上摧毀服務器中的HttpSession對象。

二、HttpSession自己是一個域對象

void setAttribute(String name,Object obj) 設置屬性
void removeAttribute(String name) 移除屬性
Object getAttribute(String name) 獲取屬性

三、HttpSession生命週期

3.1 客戶端向服務器第一次發送請求的時候,request中並沒有sessionID.
3.2 此時server端會建立一個session對象,並分配一個sessionID,serssion對象會保存在服務器端。此時session的狀態處於new state狀態,若是調用session.isNew(),則返回true
3.3 當服務器段處理完畢後,將此sessionID,以Cookie的形式傳到客戶段。
3.4 當客戶段再次發送請求時,會將sessionID 同request參數一塊兒發送,傳遞給服務器端。
3.5 服務器端能夠根據傳遞過來的sessionID將此次請求(request)與保存在服務器端的session對象聯繫起來,此時的session已不處於new state狀態,若是調用session.isNew(),則返回false.
3.6 循環3-5 ,直到session超時或被銷燬。

四、HttpSession對象的狀態轉換

HttpSession對象默認超時爲30分鐘。
4.1 更改HttpSession的默認超時時間:
在web.xml中配置

1
2
3
<session-config>
  <session-timeout>1</session-timeout><!--單位爲1分鐘-->
</session-config>

 

其餘

IE什麼時候開啓一次新的會話

一、IE7-(含):開啓一次新的瀏覽器進程就是一次新的會話。 二、IE8+(含):開啓一次新的瀏覽器進程與原開啓的進程屬於同一次會話。(「文件」/」新建會話」) 三、開啓了一個頁面,再開啓一個新的Tab頁.也是同一次會話 四、開啓了一個頁面,在此頁面上鍊接到了另一個頁面(在新窗口打開的).也是同一次會話

相關文章
相關標籤/搜索