Java會話(session)管理

來源:互聯網
上載者:User

標籤:

會話概述什麼是會話

簡單的理解:使用者開啟瀏覽器,點擊多個超連結,訪問Web伺服器上多個資源,然後關閉瀏覽器,整個過程稱之為一次會話。

需要解決的問題

每個使用者在使用瀏覽器與伺服器會話的過程中,會產生一些使用者資料,如使用者登陸標記,WEB應用程式必須要為每個使用者在一次或多次會話過程中儲存這些資料。

兩種技術
  • Cookie
    Cookie是用戶端技術,WEB應用程式把每個使用者資料以Cookie的形式發送給各自的的瀏覽器,當使用者使用瀏覽器再次訪問WEB應用時,就會帶上這些Cookie,這樣,WEB應用可以為每個使用者分別處理各自的資料了。
  • HttpSession
    簡稱Session,是伺服器端技術,伺服器在運行時為每個使用者的瀏覽器建立一個其獨享的HttpSession對象。由於使用者各自獨享session,所以可以把各自的資料存放在各自的session域中,當使用者去訪問當前web應用其他web資源時,其他web資源再從使用者各自的session中取出資料為其服務。

    Cookie類

    1、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的path設定成了/app/,說明訪問/app/下面的任何資源,都會帶cookie過去。

  • domain:預設就是產生Cookie的Servlet所在的網站網域名稱

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

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

要想在用戶端的緩衝中儲存住Cookie的資料,增大它的存活時間。單位是秒
如果取值為0,就是要刪除之。

  • version:可選,Cookie的版本

2、伺服器向用戶端寫Cookie
response.addCookie(Cookie cookie);對應設定回應標頭的“Set-Cookie”

3、擷取用戶端提交過來的Cookie
Cookie[] cookies = request.getCookies();接著遍曆cookies數組確定所需的Cookie

4、如何唯一確定一個Cookie(有同名Cookie情況)
通過domain+path+name,可以確定唯一一個Cookie

5、其他

  • 一個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技術

1、獲得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對象。

2、HttpSession本身是一個域對象

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

3、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逾時或被銷毀。

4、HttpSession對象的狀態轉換

HttpSession對象預設逾時為30分鐘。
4.1 更改HttpSession的預設逾時時間:
在web.xml中配置

123
<session-config>  <session-timeout>1</session-timeout><!--單位為1分鐘--></session-config>

4.2 HttpSession對象狀態

Java會話(session)管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.