国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - servlet之session工作原理簡介_動力節點Java學院整理

servlet之session工作原理簡介_動力節點Java學院整理

2020-12-07 11:10fjdingsd Java教程

這篇文章主要介紹了servlet之session工作原理簡介,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

要了解session的底層工作原理。我們還是先看在一個會話過程中,同一個瀏覽器在訪問多個web資源的情況好了,大致分為以下幾個步驟:

1,瀏覽器訪問某個servlet,這時如果服務器要從請求對象中獲取session對象(第一次獲取也是創建),那么服務器會為這個session對象創建一個id:jsessionid

2,同時在對瀏覽器的響應過程中,這個session會將jsessionid這個id以cookie形式回送給客戶端瀏覽器,記住,這時候cookie服務器沒有設置有效時間,因此是存在瀏覽器的緩存中,而不是在硬盤文件。

3,當用戶繼續在這個會話過程中訪問其他servlet,這時候這個servlet再從請求對象中獲取session對象,注意這時候獲取session對象是從瀏覽器發來的請求中查詢是否有名為jsessionid的這個cookie,如果有,那么這個session就不用再創建,而是直接根據查詢服務器中這個相同jsessionid值的session,換句話說就可以取得之前存在這個session中的數據。

總結來說,session是基于cookie的。

(注:cookie并不是萬能的,session首先是依據cookie,但是有時候cookie不能用,這時候session會查詢發來請求的url地址是否有jsessionid。)

session的隱藏cookie,我們可以做個小實驗來驗證下,在【myservlet】這個web工程下創建兩個servlet,分別命名為sessiondemo1和sessiondemo2:

在sessiondemo1代碼為:

?
1
2
3
httpsession session = request.getsession();
string data = "message from sessiondemo";
session.setattribute("data", data);

在sessiondemo2代碼為:

?
1
2
httpsession session = request.getsession();
system.out.println((string)session.getattribute("data"));

我們在瀏覽器中打開httpwatch,來訪問sessiondemo1,因為是首次訪問servlet,查看sessiondemo1給瀏覽器的響應:

servlet之session工作原理簡介_動力節點Java學院整理

確確實實服務器發送回瀏覽器有這個jsessionid名稱的cookie,這時候如果我們再在打開的瀏覽器去訪問sessiondemo2,那么在httpwatch中觀察請求包的內容發現:

servlet之session工作原理簡介_動力節點Java學院整理

再次訪問服務器時,瀏覽器就會帶著這個名為jsessionid的cookie給服務器,服務器正是通過這個cookie中的jsessionid值去服務器中查找之前為該瀏覽器創建的session。

如果我們將瀏覽器關閉,由于這個cookie沒有設置“setmaxage”,因此這個cookie只存在于瀏覽器的緩沖,瀏覽器關閉即被銷毀。如果想使關閉瀏覽器之后,session還能存在,我們就要人為的覆蓋這個session的cookie,并設置覆蓋cookie的有效時間和有效路徑。而這個cookie的值,也就是jsessionid的值,可以通過session的getid()方法得到

1,覆蓋有效時間:

注意,服務器在為瀏覽器創建session后,在用戶沒有操作的情況下(或者瀏覽器關閉后)默認為其維護30分鐘。這點可以從tomcat的【web.xml】文件中可以看出:

servlet之session工作原理簡介_動力節點Java學院整理

當然我們從這里也可以修改服務器默認的銷毀無操作的session時間。

當然如果我們不要全局設置所有服務器中session的銷毀時間,就在每個web應用中的web.xml文件中自定義添加<session-config>和<session-timeout>進行設置。

注:我們還可以通過session對象的invalidate()方法,將某個session進行立刻銷毀。

對此,如果我們要覆蓋一個session的cookie并保存在硬盤文件中,我們設置的cookie有效時間就不要超過服務器默認的session-timeout時間。

2,覆蓋有效路徑:

如果我們創建一個cookie對象,沒有設置“setpath”,那么cookie的有效路徑為創建該cookie的程序(通常為某個servlet),即只有訪問了這個程序時瀏覽器才會帶著cookie過去,那實在是“人脈不通”,訪問這個web應用的其他資源就無法再使用session了。

我們看看剛才的第一次訪問servlet時,服務器為瀏覽器創建的session中的cookie的有效路徑:

servlet之session工作原理簡介_動力節點Java學院整理

可以看到這個服務器默認將jsessionid這個cookie的有效路徑設置為創建這個session的web工程根目錄。所以我們要覆蓋session中的cookie時也應該設置路徑為該web工程根目錄。

好,接下來對上面那個servlet的例子進行改造,我們只需要在sessiondemo1中修改就行,因為這個首次將session的cookie返回給客戶端,修改后代碼如下:

?
1
2
3
4
5
6
7
8
httpsession session = request.getsession();
string data = "message from sessiondemo";
session.setattribute("data", data);
  
cookie cookie = new cookie("jsessionid", session.getid());
cookie.setmaxage(30*60);
cookie.setpath("/myservlet");
response.addcookie(cookie);

這樣,當我們打開瀏覽器訪問了sessiondemo1之后,就能在存放cookie的目錄中找到該cookie,如果我們通過httpwatch來查看可以看到重名的這個cookie:

servlet之session工作原理簡介_動力節點Java學院整理

雖然jseesionid這個cookie重名了,沒有關系,因為其值都是一樣的,并且如果我們將瀏覽器關閉后,沒有設置cookie有效時間的(也是原先session發來的)cookie將不復存在(存在瀏覽器緩存中,瀏覽器關閉就被銷毀),這時重新打開一個瀏覽器,再去訪問sessiondemo2依然能獲取到原來session中保存的內容:

servlet之session工作原理簡介_動力節點Java學院整理

注意,這是另外打開瀏覽器窗口訪問的sessiondemo2!!另附:

servlet之session工作原理簡介_動力節點Java學院整理

通過這里我們可以看到,我們人為地將原先session定義的cookie給替換了,而session并不知道,只要能獲得“jsessionid”這個cookie,它就認為cookie是存在的,可以從這個cookie中id值獲取以前保存的信息,因此我們實現了一臺主機共享一個session,此時,當瀏覽器關閉,或者說結束一個會話后,依然能獲取session來獲取之前保存的數據。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 最新高清无码专区 | 日韩在线一区二区三区免费视频 | 91精品国产综合久久福利软件 | 精品午夜久久 | 在线观看一区视频 | 自拍视频网 | 国产精品中文字幕在线 | 日本理伦片午夜理伦片 | 香蕉视频成人在线观看 | 色视频在线| 黄色毛片在线 | 欧美日韩成人在线播放 | 在线免费看黄视频 | 国产做a爰片久久毛片a我的朋友 | 狠狠操影院 | 羞羞视频免费观看 | 成人免费黄色 | 久久久精品亚洲 | 国产精品1区 | 成人日韩 | 久久99国产精品久久99果冻传媒 | 亚洲91精品| 中文字幕日韩视频 | www.爱色av.com | 国产午夜久久 | 国产综合久久 | 亚洲精品久久久久久久久久久 | 国产精品视频免费观看 | 在线激情视频 | 免费看少妇高潮一级毛片特黄 | 欧洲精品码一区二区三区免费看 | 国产一区二区三区 | 国产成人自拍视频在线观看 | 91xxx在线观看 | 精品国产精品三级精品av网址 | 亚洲国产精品一区 | 国产综合在线视频 | 中文字幕一区二区三区乱码图片 | 欧美一区永久视频免费观看 | 人成久久 | 亚洲精品一区二区三区蜜桃久 |