最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年07月27日 10:12:41   作者:fjdingsd  
這篇文章主要介紹了servlet之session工作原理簡介,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

3,當用戶繼續(xù)在這個會話過程中訪問其他Servlet,這時候這個Servlet再從請求對象中獲取Session對象,注意這時候獲取Session對象是從瀏覽器發(fā)來的請求中查詢是否有名為JSESSIONID的這個Cookie,如果有,那么這個Session就不用再創(chuàng)建,而是直接根據(jù)查詢服務器中這個相同JSESSIONID值的Session,換句話說就可以取得之前存在這個Session中的數(shù)據(jù)。

總結來說,Session是基于Cookie的。

(注:cookie并不是萬能的,Session首先是依據(jù)cookie,但是有時候cookie不能用,這時候Session會查詢發(fā)來請求的URL地址是否有JSESSIONID。)

Session的隱藏Cookie,我們可以做個小實驗來驗證下,在【myservlet】這個web工程下創(chuàng)建兩個Servlet,分別命名為SessionDemo1和SessionDemo2:

在SessionDemo1代碼為:

   HttpSession session = request.getSession();
   String data = "Message from SessionDemo";
   session.setAttribute("data", data);

在SessionDemo2代碼為:

   HttpSession session = request.getSession();
   System.out.println((String)session.getAttribute("data"));

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

確確實實服務器發(fā)送回瀏覽器有這個JSESSIONID名稱的Cookie,這時候如果我們再在打開的瀏覽器去訪問SessionDemo2,那么在HttpWatch中觀察請求包的內容發(fā)現(xiàn):

再次訪問服務器時,瀏覽器就會帶著這個名為JSESSIONID的Cookie給服務器,服務器正是通過這個cookie中的JSESSIONID值去服務器中查找之前為該瀏覽器創(chuàng)建的Session。

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

1,覆蓋有效時間:

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

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

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

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

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

2,覆蓋有效路徑:

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

我們看看剛才的第一次訪問Servlet時,服務器為瀏覽器創(chuàng)建的Session中的cookie的有效路徑:

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

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

   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:

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

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

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

相關文章

  • Java實現(xiàn)Excel導入導出的步驟詳解

    Java實現(xiàn)Excel導入導出的步驟詳解

    這篇文章主要為大家詳細介紹了java實現(xiàn)Excel的導入、導出,文中示例代碼介紹的非常詳細,對我們的學習或工作有一定的幫助,感興趣的小伙伴們可以參考一下
    2023-06-06
  • idea中創(chuàng)建jsp項目的詳細實戰(zhàn)步驟

    idea中創(chuàng)建jsp項目的詳細實戰(zhàn)步驟

    才學javaWeb,以防自己忘記創(chuàng)建項目的過程,所以淺淺的記錄一下吧,下面這篇文章主要給大家介紹了關于idea中創(chuàng)建jsp項目的詳細步驟,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • win10下定時運行與開機自啟動jar包的方法記錄

    win10下定時運行與開機自啟動jar包的方法記錄

    這篇文章主要給大家介紹了關于win10下定時運行與開機自啟動jar包的相關資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • SpringBoot Data JPA 關聯(lián)表查詢的方法

    SpringBoot Data JPA 關聯(lián)表查詢的方法

    這篇文章主要介紹了SpringBoot Data JPA 關聯(lián)表查詢的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 高并發(fā)系統(tǒng)的限流詳解及實現(xiàn)

    高并發(fā)系統(tǒng)的限流詳解及實現(xiàn)

    這篇文章主要介紹了高并發(fā)系統(tǒng)的限流詳解及實現(xiàn),內容詳細,小編覺得很不錯,這里分享給大家,供需要的朋友參考。隨小編一起看看吧。
    2017-11-11
  • Maven項目打包成可執(zhí)行Jar文件步驟解析

    Maven項目打包成可執(zhí)行Jar文件步驟解析

    這篇文章主要介紹了Maven項目如何打包成可執(zhí)行Jar文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • 解決springboot中配置過濾器以及可能出現(xiàn)的問題

    解決springboot中配置過濾器以及可能出現(xiàn)的問題

    這篇文章主要介紹了解決springboot中配置過濾器以及可能出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • RabbitMQ 如何解決消息冪等性的問題

    RabbitMQ 如何解決消息冪等性的問題

    這篇文章主要介紹了RabbitMQ 如何解決消息冪等性的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springcloud config配置讀取優(yōu)先級過程詳解

    springcloud config配置讀取優(yōu)先級過程詳解

    這篇文章主要介紹了springcloud config配置讀取優(yōu)先級過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Java實現(xiàn)枚舉狀態(tài)轉換的方法詳解

    Java實現(xiàn)枚舉狀態(tài)轉換的方法詳解

    在軟件開發(fā)中,我們經常需要處理不同系統(tǒng)或模塊間的狀態(tài)轉換,今天,我將通過一個電商訂單與物流狀態(tài)的轉換案例,展示如何優(yōu)雅地實現(xiàn)枚舉間的互相轉換,需要的朋友可以參考下
    2025-04-04

最新評論

蒲江县| 连江县| 垣曲县| 钟祥市| 尼勒克县| 克拉玛依市| 太湖县| 白山市| 望城县| 扶余县| 沛县| 瓮安县| 牡丹江市| 宣威市| 大英县| 萨迦县| 金昌市| 四子王旗| 吴江市| 南华县| 武胜县| 唐山市| 杨浦区| 荥阳市| 温州市| 健康| 葵青区| 措美县| 峡江县| 禹州市| 祁东县| 昭觉县| 磐安县| 临泽县| 白朗县| 明溪县| 苗栗县| 灵宝市| 贵德县| 资中县| 阳城县|