亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

servlet之session工作原理簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

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

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

1,瀏覽器訪問(wèn)某個(gè)Servlet,這時(shí)如果服務(wù)器要從請(qǐng)求對(duì)象中獲取Session對(duì)象(第一次獲取也是創(chuàng)建),那么服務(wù)器會(huì)為這個(gè)Session對(duì)象創(chuàng)建一個(gè)id:JSESSIONID

2,同時(shí)在對(duì)瀏覽器的響應(yīng)過(guò)程中,這個(gè)Session會(huì)將JSESSIONID這個(gè)id以Cookie形式回送給客戶端瀏覽器,記住,這時(shí)候Cookie服務(wù)器沒(méi)有設(shè)置有效時(shí)間,因此是存在瀏覽器的緩存中,而不是在硬盤文件。

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

總結(jié)來(lái)說(shuō),Session是基于Cookie的。

(注:cookie并不是萬(wàn)能的,Session首先是依據(jù)cookie,但是有時(shí)候cookie不能用,這時(shí)候Session會(huì)查詢發(fā)來(lái)請(qǐng)求的URL地址是否有JSESSIONID。)

Session的隱藏Cookie,我們可以做個(gè)小實(shí)驗(yàn)來(lái)驗(yàn)證下,在【myservlet】這個(gè)web工程下創(chuàng)建兩個(gè)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"));

我們?cè)跒g覽器中打開(kāi)HttpWatch,來(lái)訪問(wèn)SessionDemo1,因?yàn)槭鞘状卧L問(wèn)Servlet,查看SessionDemo1給瀏覽器的響應(yīng):

確確實(shí)實(shí)服務(wù)器發(fā)送回瀏覽器有這個(gè)JSESSIONID名稱的Cookie,這時(shí)候如果我們?cè)僭诖蜷_(kāi)的瀏覽器去訪問(wèn)SessionDemo2,那么在HttpWatch中觀察請(qǐng)求包的內(nèi)容發(fā)現(xiàn):

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

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

1,覆蓋有效時(shí)間:

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

當(dāng)然我們從這里也可以修改服務(wù)器默認(rèn)的銷毀無(wú)操作的Session時(shí)間。

當(dāng)然如果我們不要全局設(shè)置所有服務(wù)器中Session的銷毀時(shí)間,就在每個(gè)web應(yīng)用中的web.xml文件中自定義添加<session-config>和<session-timeout>進(jìn)行設(shè)置。

注:我們還可以通過(guò)Session對(duì)象的invalidate()方法,將某個(gè)Session進(jìn)行立刻銷毀。

對(duì)此,如果我們要覆蓋一個(gè)Session的cookie并保存在硬盤文件中,我們?cè)O(shè)置的cookie有效時(shí)間就不要超過(guò)服務(wù)器默認(rèn)的session-timeout時(shí)間。

2,覆蓋有效路徑:

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

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

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

好,接下來(lái)對(duì)上面那個(gè)Servlet的例子進(jìn)行改造,我們只需要在SessionDemo1中修改就行,因?yàn)檫@個(gè)首次將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);

這樣,當(dāng)我們打開(kāi)瀏覽器訪問(wèn)了SessionDemo1之后,就能在存放cookie的目錄中找到該cookie,如果我們通過(guò)HttpWatch來(lái)查看可以看到重名的這個(gè)cookie:

雖然JSEESIONID這個(gè)cookie重名了,沒(méi)有關(guān)系,因?yàn)槠渲刀际且粯拥模⑶胰绻覀儗g覽器關(guān)閉后,沒(méi)有設(shè)置cookie有效時(shí)間的(也是原先Session發(fā)來(lái)的)cookie將不復(fù)存在(存在瀏覽器緩存中,瀏覽器關(guān)閉就被銷毀),這時(shí)重新打開(kāi)一個(gè)瀏覽器,再去訪問(wèn)SessionDemo2依然能獲取到原來(lái)Session中保存的內(nèi)容:

注意,這是另外打開(kāi)瀏覽器窗口訪問(wèn)的SessionDemo2!!另附:

通過(guò)這里我們可以看到,我們?nèi)藶榈貙⒃萐ession定義的cookie給替換了,而Session并不知道,只要能獲得“JSESSIONID”這個(gè)cookie,它就認(rèn)為cookie是存在的,可以從這個(gè)cookie中id值獲取以前保存的信息,因此我們實(shí)現(xiàn)了一臺(tái)主機(jī)共享一個(gè)Session,此時(shí),當(dāng)瀏覽器關(guān)閉,或者說(shuō)結(jié)束一個(gè)會(huì)話后,依然能獲取Session來(lái)獲取之前保存的數(shù)據(jù)。

相關(guān)文章

  • Java中HashMap里面key為null存放到哪

    Java中HashMap里面key為null存放到哪

    這篇文章主要介紹了Java中HashMap里面key為null存放到哪,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • java中求高精度除法,要求保留N位小數(shù)

    java中求高精度除法,要求保留N位小數(shù)

    這篇文章主要介紹了java中求高精度除法,要求保留N位小數(shù)的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java注釋代碼執(zhí)行方法解析

    Java注釋代碼執(zhí)行方法解析

    這篇文章主要介紹了Java注釋代碼執(zhí)行方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot各種事務(wù)操作實(shí)戰(zhàn)(自動(dòng)回滾、手動(dòng)回滾、部分回滾)

    SpringBoot各種事務(wù)操作實(shí)戰(zhàn)(自動(dòng)回滾、手動(dòng)回滾、部分回滾)

    本文主要介紹了SpringBoot各種事務(wù)操作實(shí)戰(zhàn),包含自動(dòng)回滾、手動(dòng)回滾、部分回滾這三種,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • JAVA Calendar類使用方面實(shí)例

    JAVA Calendar類使用方面實(shí)例

    這篇文章主要介紹了JAVA Calendar類使用方面實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java基于odbc連接oracle的實(shí)現(xiàn)方法

    java基于odbc連接oracle的實(shí)現(xiàn)方法

    這篇文章主要介紹了java基于odbc連接oracle的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了連接操作的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-09-09
  • spring security環(huán)境搭建

    spring security環(huán)境搭建

    本文通過(guò)代碼給大家介紹了spring security環(huán)境搭建的詳細(xì)教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09
  • Java SPI機(jī)制原理及代碼實(shí)例

    Java SPI機(jī)制原理及代碼實(shí)例

    這篇文章主要介紹了Java SPI機(jī)制原理及代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例

    Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例

    這篇文章主要介紹了Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • SpringMVC整合,出現(xiàn)注解沒(méi)有起作用的情況處理

    SpringMVC整合,出現(xiàn)注解沒(méi)有起作用的情況處理

    這篇文章主要介紹了SpringMVC整合,出現(xiàn)注解沒(méi)有起作用的情況及處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-05-05

最新評(píng)論