[serverlet][轉載: 深刻理解HTTP Session]

[serverlet][轉載: 深刻理解HTTP Session]

標籤(空格分隔): 未分類html


原創做品,容許轉載,轉載時請務必以超連接形式標明文章 原始出處 、做者信息和本聲明。不然將追究法律責任。http://lavasoft.blog.51cto.com/62575/275589java

session在web開發中是一個很是重要的概念,這個概念很抽象,很難定義,也是最讓人迷惑的一個名詞,也是最多被濫用的名字之一,在不一樣的場合,session一次的含義也很不相同。這裏只探討HTTP Sessionweb

爲了說明問題,這裏基於Java Servlet理解Session的概念與原理,這裏所說Servlet已經涵蓋了JSP技術,由於JSP最終也會被編譯爲Servlet,二者有着相同的本質。算法

  • 在Java中,HTTP的Session對象用javax.servlet.http.HttpSession來表示

概念

概念:Session表明服務器與瀏覽器的一次會話過程,這個過程是連續的,也能夠時斷時續的。在Servlet中,session指的是HttpSession類的對象,這個概念到此結束了,也許會很模糊,但只有看完本文,才能真正有個深入理解。瀏覽器

建立時間

  • 一個常見的誤解是覺得session在有客戶端訪問時就被建立服務器

  • 然而事實是直到某server端程序調用HttpServletRequest.getSession(true)這樣的語句時才被建立session

  • 注意若是JSP沒有顯示的使用<% @page session="false"%> 關閉session
    則JSP文件在編譯成Servlet時將會自動加上這樣一條語句 HttpSession session = HttpServletRequest.getSession(true);
    • 這也是JSP中隱含的 session對象的來歷。
    • 因爲session會消耗內存資源,所以,若是不打算使用session,應該在全部的JSP中關閉它。

引伸

  • 訪問*.html的靜態資源由於不會被編譯爲Servlet,也就不涉及session的問題。
  • 當JSP頁面沒有顯式禁止session的時候,在打開瀏覽器第一次請求該jsp的時候,服務器會自動爲其建立一個session,並賦予其一個sessionID,發送給客戶端的瀏覽器。之後客戶端接着請求本應用中其餘資源的時候,會自動在請求頭上添加:jsp

    Cookie:JSESSIONID=客戶端第一次拿到的session ID

    這樣,服務器端在接到請求時候,就會收到session ID,並根據ID在內存中找到以前建立的session對象,提供給請求使用。這也是session使用的基本原理----搞不懂這個,就永遠不明白session的原理。
    下面是兩次請求同一個jsp,請求頭信息:url

    image_1b1dudb1e1gduto91k9a1gpo1cg89.png-31.3kB

Session刪除的時間是:

  • 1)Session超時:超時指的是連續必定時間服務器沒有收到該Session所對應客戶端的請求,而且這個時間超過了服務器設置的Session超時的最大時間。
  • 2)程序調用HttpSession.invalidate()
  • 3)服務器關閉或服務中止

Session存放在哪裏

  • 服務器端的內存中。不過session能夠經過特殊的方式作持久化管理。

session的id是從哪裏來

sessionID是如何使用的:當客戶端第一次請求session對象時候,服務器會爲客戶端建立一個session,並將經過特殊算法算出一個session的ID,用來標識該session對象,當瀏覽器下次(session繼續有效時)請求別的資源的時候,瀏覽器會偷偷地將sessionID放置到請求頭中,服務器接收到請求後就獲得該請求的sessionID,服務器找到該id的session返還給請求者(Servlet)使用。一個會話只能有一個session對象,對session來講是隻認id不認人。3d

session會由於瀏覽器的關閉而刪除嗎

不會,session只會經過上面提到的方式去關閉。

同一客戶端機器屢次請求同一個資源,session同樣嗎

  • 通常來講,每次請求都會新建立一個session。

    image_1b1duh2qe1atm1hso1i7qd63d8lm.png-253.8kB

  • 其實,這個也不必定的,總結下:對於多標籤的瀏覽器(好比360瀏覽器)來講,在一個瀏覽器窗口中,多個標籤同時訪問一個頁面,session是一個。對於多個瀏覽器窗口之間,同時或者相隔很短期訪問一個頁面,session是多個的,和瀏覽器的進程有關。對於一個同一個瀏覽器窗口,直接錄入url訪問同一應用的不一樣資源,session是同樣的。

其餘

  • session是一個容器,能夠存放會話過程當中的任何對象。
  • session由於請求(request對象)而產生,同一個會話中多個request共享了一session對象,能夠直接從請求中獲取到session對象。
  • 其實,session的建立和使用總在服務端,而瀏覽器歷來都沒獲得過session對象。但瀏覽器能夠請求Servlet(jsp也是Servlet)來獲取session的信息。客戶端瀏覽器真正牢牢拿到的是session ID,而這個對於瀏覽器操做的人來講,是不可見的,而且用戶也無需關心本身處於哪一個會話過程當中。

  • 本文出自 「熔 巖」 博客,請務必保留此出處http://lavasoft.blog.51cto.com/62575/275589

相關文章
相關標籤/搜索