深入理解HTTP Session

session在web開發中是一個非常重要的概念,這個概念很抽象,很難定義,也是最讓人迷惑的一個名詞,也是最多被濫用的名字之一,在不同的場合,session一次的含義也很不相同。這里只探討HTTP Session。
為了說明問題,這里基于Java Servlet理解Session的概念與原理,這里所說Servlet已經涵蓋了JSP技術,因為JSP最終也會被編譯為Servlet,兩者有著相同的本質。
在Java中,HTTP的Session對象用javax.servlet.http.HttpSession來表示。

1、概念:

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

2、Session創建的時間是:

一個常見的誤解是以為session在有客戶端訪問時就被創建,然而事實是直到某server端程序調用 HttpServletRequest.getSession(true)這樣的語句時才被創建,注意如果JSP沒有顯示的使用 <% @page session="false"%> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句 HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的 session對象的來歷。
由于session會消耗內存資源,因此,如果不打算使用session,應該在所有的JSP中關閉它。
引申:
1)、訪問*.html的靜態資源因為不會被編譯為Servlet,也就不涉及session的問題。
2)、當JSP頁面沒有顯式禁止session的時候,在打開瀏覽器第一次請求該jsp的時候,服務器會自動為其創建一個session,并賦予其一個sessionID,發送給客戶端的瀏覽器。以后客戶端接著請求本應用中其他資源的時候,會自動在請求頭上添加:
Cookie:JSESSIONID=客戶端第一次拿到的session ID
這樣,服務器端在接到請求時候,就會收到session ID,并根據ID在內存中找到之前創建的session對象,提供給請求使用。這也是session使用的基本原理----搞不懂這個,就永遠不明白session的原理。
下面是兩次請求同一個jsp,請求頭信息:

通過圖可以清晰發現,第二次請求的時候,已經添加session ID的信息。
?
3、Session刪除的時間是:
1)Session超時:超時指的是連續一定時間服務器沒有收到該Session所對應客戶端的請求,并且這個時間超過了服務器設置的Session超時的最大時間。
2)程序調用HttpSession.invalidate()
3)服務器關閉或服務停止
4、session存放在哪里:服務器端的內存中。不過session可以通過特殊的方式做持久化管理。
5、session的id是從哪里來的,sessionID是如何使用的:當客戶端第一次請求session對象時候,服務器會為客戶端創建一個session,并將通過特殊算法算出一個session的ID,用來標識該session對象,當瀏覽器下次(session繼續有效時)請求別的資源的時候,瀏覽器會偷偷地將sessionID放置到請求頭中,服務器接收到請求后就得到該請求的sessionID,服務器找到該id的session返還給請求者(Servlet)使用。一個會話只能有一個session對象,對session來說是只認id不認人。
6、session會因為瀏覽器的關閉而刪除嗎?
不會,session只會通過上面提到的方式去關閉。
7、同一客戶端機器多次請求同一個資源,session一樣嗎?
同一客戶端機器一般來說,每次請求都會新創建一個session。

其實,這個也不一定的,總結下:對于多標簽的瀏覽器(比如360瀏覽器)來說,在一個瀏覽器窗口中,多個標簽同時訪問一個頁面,session是一個。對于多個瀏覽器窗口之間,同時或者相隔很短時間訪問一個頁面,session是多個的,和瀏覽器的進程有關。對于一個同一個瀏覽器窗口,直接錄入url訪問同一應用的不同資源,session是一樣的。
8、session是一個容器,可以存放會話過程中的任何對象。
9、session因為請求(request對象)而產生,同一個會話中多個request共享了一session對象,可以直接從請求中獲取到session對象。
10、其實,session的創建和使用總在服務端,而瀏覽器從來都沒得到過session對象。但瀏覽器可以請求Servlet(jsp也是Servlet)來獲取session的信息。客戶端瀏覽器真正緊緊拿到的是session ID,而這個對于瀏覽器操作的人來說,是不可見的,并且用戶也無需關心自己處于哪個會話過程中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539918.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539918.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hibernate的懶加載session丟失解決方法

在web.xml加入spring提供的過濾器&#xff0c;延長session的生命周期 <!--Hibernate的懶加載session丟失解決方法 --><filter><filter-name>openSessionInView</filter-name><filter-class>org.springframework.orm.hibernate4.support.OpenSess…

Linux訪問其他進程空間,Linux環境進程間通信系列(五):共享內存

共享內存可以說是最有用的進程間通信方式&#xff0c;也是最快的IPC形式。兩個不同進程A、B共享內存的意思是&#xff0c;同一塊物理內存被映射到進程A、B各自的進程地址空間。進程A可以即時看到進程B對共享內存中數據的更新&#xff0c;反之亦然。由于多個進程共享同一塊內存區…

沖刺NO.8

Alpha沖刺第八天 站立式會議 項目進展 項目穩步進行&#xff0c;項目的基礎部分如基本信息管理&#xff0c;信用信息管理等部分已相對比較完善。 問題困難 技術困難在短期內很難發生質的變化&#xff0c;而本項目由于選擇了隊員不太熟悉的程序框架&#xff0c;所以所以項目的交…

linux由眾多微內核組成,什么是linux

大家對Linux這個詞比較陌生吧&#xff0c;那么Linux是什么呢&#xff1f;Linux是什么Linux是一種自由和開放源碼的類Unix操作系統。目前存在著許多不同的Linux&#xff0c;但它們都使用了Linux內核。Linux可安裝在各種計算機硬件設備中&#xff0c;從手機、平板電腦、路由器和視…

淺析jQuery中常用的元素查找方法總結

$("#myELement") 選擇id值等于myElement的元素&#xff0c;id值不能重復在文檔中只能有一個id值是myElement所以得到的是唯一的元素 $("div") 選擇所有的div標簽元素&#xff0c;返回div元素數組 $(".myClass") 選擇使用myClass類的css的所有…

右擊菜單一鍵優化(增加新建office2003、新建reg和bat,刪除新建公文包、新建wps、新建rar)...

右擊菜單一鍵優化&#xff08;增加新建office2003、新建reg和bat&#xff0c;刪除新建公文包、新建wps、新建rar&#xff09; Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.doc]"Word.Document.8""Content Type""application/msword&qu…

jquery獲取select選擇的顯示值

轉載自&#xff1a;http://blog.csdn.net/a5489888/article/details/8611703 本來以為jQuery("#select1").val();是取得選中的值&#xff0c; 那么jQuery("#select1").text();就是取得的文本。 這是不正確的&#xff0c;正確做法是&#xff1a; jQuery(&qu…

克隆整個linux系統環境的軟件,開源的系統克隆工具 Clonezilla(再生龍)linux、UBUNTU備份不用愁...

Clonezilla是一個很好的系統克隆工具,它基于Partimage,吸取了Norton Ghost和Partition Image的優點。即不僅支持對整個系統進行克隆,而且也可以克隆單個的分區,這種靈活性可能更能適應備份者的需要。支持GNU/Linux的文件系統 ext2、ext3、reiserfs、xfs、jfs和Windows的FAT、FA…

SqlServer2008備份與還原(完整圖示版)

一、備份 1、在需要備份的數據庫上&#xff0c;右鍵——任務——備份&#xff0c;如下&#xff1a; 2、選擇備份到哪個路徑和備份名字&#xff1a; 點擊“添加”&#xff0c;如下&#xff0c; 3、上面點擊“確定”后&#xff0c;回到第一個頁面&#xff0c;選中剛才添加的路徑和…

Jquery mobile問題總匯

轉載&#xff1a;http://www.wglong.com/main/artical!details?id4#q6 1頁面縮放顯示問題 問題描述&#xff1a; 頁面似乎被縮小了&#xff0c;屏幕太寬了。 解決辦法&#xff1a; 在head標簽內加入&#xff1a; <meta name"viewport" content"widthdevice…

Linux通過文件大小查找,linux 根據文件大小查找文件

linux下的find命令用來查找文件&#xff0c;通過man find就知道它是無所不能的。所以按照文件大小來查找文件就不在話下。從man find搜索size&#xff0c;可以看到如下信息&#xff1a;-size n[cwbkMG]File uses n units of space. The following suffixes can be used:b for 5…

DBCP連接池介紹

DBCP連接池介紹 ----------------------------- 目前 DBCP 有兩個版本分別是 1.3 和 1.4。 DBCP 1.3 版本需要運行于 JDK 1.4-1.5 &#xff0c;支持 JDBC 3。 DBCP 1.4 版本需要運行于 JDK 1.6 &#xff0c;支持 JDBC 4。 1.3和1.4基于同一套源代碼&#xff0c;含有所有的bug修…

linux解釋名詞shell環境,Linux 定時任務

實現linux定時任務有:cron、anacron、at等&#xff0c;這里主要介紹cron服務。名詞解釋&#xff1a;cron是服務名稱&#xff0c;crond是后臺進程&#xff0c;crontab則是定制好的計劃任務表。軟件包安裝&#xff1a;要使用cron服務&#xff0c;先要安裝vixie-cron軟件包和cront…

Python3 實現用戶登陸,輸入三次密碼

不加注釋版 #/usr/bin/python3 import readline user "seven" passwd "123" username input("please the enter user:") for i in range(3):password input("please the enter password:")if password.isdigit():password int(pa…

linux pcre靜態編譯,Linux下,Nginx部署靜態網站

1、準備工作選首先安裝這幾個軟件&#xff1a;GCC&#xff0c;PCRE(Perl Compatible Regular Expression)&#xff0c;zlib&#xff0c;OpenSSL。Nginx是C寫的&#xff0c;需要用GCC編譯&#xff1b;Nginx的Rewrite和HTTP模塊會用到PCRE&#xff1b;Nginx中的Gzip用到zlib&…

【HTML5初探之本地存儲】如果沒有數據庫。。。

導航【初探HTML5之使用新標簽布局】用html5布局我的博客頁&#xff01;【HTML5初探之form標簽】解放表單驗證、增加文件上傳、集成拖放【HTML5初探之繪制圖像&#xff08;上&#xff09;】看我canvas元素引領下一代web頁面【HTML5初探之繪制圖像&#xff08;下&#xff09;】看…

FragmentActivity和Activity的具體區別

fragment是3.0以后的東西&#xff0c;為了在低版本中使用fragment就要用到android-support-v4.jar兼容包,而fragmentActivity就是這個兼容包里面的&#xff0c;它提供了操作fragment的一些方法&#xff0c;其功能跟3.0及以后的版本的Activity的功能一樣。 下面是API中的原話&am…

算法理論

ylbtech-Arithmetic:算法理論-- -- ylb&#xff1a;算法-- Type:算法-- 簡簡單單的一個月&#xff0c;完成一個臺階的提升-- 1&#xff0c;著重于算法的研究&#xff08;謝謝她為我出的那道題&#xff09;-- 2&#xff0c;可以不太依附工具環境開發&#xff0c;現在,也可使用記…

linux環境OpenRASP使用教程,集成openRASP與攻擊測試

1.介紹openRASP是一個百度的安全框架&#xff0c;將其集成到我們的web項目中&#xff0c;就像是給web項目安裝了一款“安全管家”的軟件&#xff0c;它可以檢測到攻擊&#xff0c;并進行攔截。2.集成openRASP到項目中openRASP針對不同的服務器&#xff0c;提供了不同的安裝方法…

JQuery調用iframe子頁面函數/對象的方法

JQuery調用iframe子頁面函數/對象的方法例子&#xff1a; 父頁面有個ID為mainfrm的iframe&#xff0c;iframe連接b.html&#xff0c;該頁面有個函數test 在父頁面調用b.html的test方法為&#xff1a; $("#mainfrm")[0].contentWindow.test();