標籤(空格分隔): 未分類html
原創做品,容許轉載,轉載時請務必以超連接形式標明文章 原始出處 、做者信息和本聲明。不然將追究法律責任。http://lavasoft.blog.51cto.com/62575/275589java
session
在web開發中是一個很是重要的概念,這個概念很抽象,很難定義,也是最讓人迷惑的一個名詞,也是最多被濫用的名字之一,在不一樣的場合,session一次的含義也很不相同。這裏只探討HTTP Session。web
爲了說明問題,這裏基於Java Servlet
理解Session的概念與原理,這裏所說Servlet已經涵蓋了JSP技術,由於JSP最終也會被編譯爲Servlet,二者有着相同的本質。算法
javax.servlet.http.HttpSession
來表示概念:Session表明服務器與瀏覽器的一次會話過程,這個過程是連續的,也能夠時斷時續的。在Servlet中,session指的是HttpSession類的對象,這個概念到此結束了,也許會很模糊,但只有看完本文,才能真正有個深入理解。瀏覽器
一個常見的誤解是覺得session在有客戶端訪問時就被建立服務器
然而事實是直到某server端程序調用HttpServletRequest.getSession(true)
這樣的語句時才被建立session
<% @page session="false"%>
關閉sessionHttpSession session = HttpServletRequest.getSession(true);
當JSP頁面沒有顯式禁止session的時候,在打開瀏覽器第一次請求該jsp的時候,服務器會自動爲其建立一個session,並賦予其一個sessionID,發送給客戶端的瀏覽器。之後客戶端接着請求本應用中其餘資源的時候,會自動在請求頭上添加:jsp
Cookie:JSESSIONID=客戶端第一次拿到的session ID
這樣,服務器端在接到請求時候,就會收到session ID,並根據ID在內存中找到以前建立的session對象,提供給請求使用。這也是session使用的基本原理----搞不懂這個,就永遠不明白session的原理。
下面是兩次請求同一個jsp,請求頭信息:url
sessionID是如何使用的:當客戶端第一次請求session對象時候,服務器會爲客戶端建立一個session,並將經過特殊算法算出一個session的ID,用來標識該session對象,當瀏覽器下次(session繼續有效時)請求別的資源的時候,瀏覽器會偷偷地將sessionID放置到請求頭中,服務器接收到請求後就獲得該請求的sessionID,服務器找到該id的session返還給請求者(Servlet)使用。一個會話只能有一個session對象,對session來講是隻認id不認人。3d
不會,session只會經過上面提到的方式去關閉。
通常來講,每次請求都會新建立一個session。
其實,這個也不必定的,總結下:對於多標籤的瀏覽器(好比360瀏覽器)來講,在一個瀏覽器窗口中,多個標籤同時訪問一個頁面,session是一個。對於多個瀏覽器窗口之間,同時或者相隔很短期訪問一個頁面,session是多個的,和瀏覽器的進程有關。對於一個同一個瀏覽器窗口,直接錄入url訪問同一應用的不一樣資源,session是同樣的。
其實,session的建立和使用總在服務端,而瀏覽器歷來都沒獲得過session對象。但瀏覽器能夠請求Servlet(jsp也是Servlet)來獲取session的信息。客戶端瀏覽器真正牢牢拿到的是session ID,而這個對於瀏覽器操做的人來講,是不可見的,而且用戶也無需關心本身處於哪一個會話過程當中。
本文出自 「熔 巖」 博客,請務必保留此出處http://lavasoft.blog.51cto.com/62575/275589