教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

JAVA培訓(xùn)之HttpSession原理

更新時(shí)間:2016年08月26日11時(shí)57分 來(lái)源:傳智播客JAVA培訓(xùn)學(xué)院 瀏覽次數(shù):

通過(guò)HttpSession案例一HttpSession案例二的學(xué)習(xí),大家對(duì)HttpSession的用途有了一定的了解。今天我們來(lái)深入了解HttpSession的原理。學(xué)習(xí)HttpSession的原理對(duì)大家運(yùn)用HttpSession有很大幫助。

1.HttpSession原理分析

首先,我們知道session對(duì)象是由服務(wù)器創(chuàng)建,并保存在服務(wù)器端。那么服務(wù)器在什么情況下創(chuàng)建session對(duì)象?瀏覽器在訪問(wèn)服務(wù)器時(shí),服務(wù)器又是通過(guò)什么來(lái)找到對(duì)應(yīng)的session對(duì)象呢?帶著這些問(wèn)題,我們來(lái)深入了解HttpSession。
1.1服務(wù)器如何識(shí)別session對(duì)象
session是依賴于Cookie的。瀏覽器訪問(wèn)服務(wù)器后,在瀏覽器端查看cookie時(shí)可以發(fā)現(xiàn)一個(gè)名為JSESSIONID的cookie。如圖1-1所示:

圖1-1 cookie信息
從圖1-1可以看出,這個(gè)名字為JSESSIONID的cookie的值是A147B274C704729BA01624490C898757,并且過(guò)期時(shí)間為瀏覽會(huì)話結(jié)束時(shí),即表示當(dāng)瀏覽器關(guān)閉,該cookie就死亡。其實(shí)這個(gè)cookie的值就是當(dāng)前會(huì)話session的id值。
服務(wù)器每次創(chuàng)建的session對(duì)象,都具有一個(gè)id屬性,也是唯一標(biāo)識(shí)的屬性。服務(wù)器創(chuàng)建session后,將它的id值保存在cookie中,然后發(fā)送給瀏覽器。瀏覽器在一次會(huì)話中無(wú)論訪問(wèn)服務(wù)器的那個(gè)資源都會(huì)帶著這個(gè)cookie,服務(wù)器會(huì)根據(jù)cookie的值找到對(duì)應(yīng)的session,然后從session中取出數(shù)據(jù)。下面通過(guò)一張圖形象理解這個(gè)過(guò)程們,如圖1-2所示:

圖1-2 瀏覽器與服務(wù)器之間傳遞session過(guò)程
調(diào)用request.getSession()方法是從名為JSESSIONID的cookie中獲取session的id值,然后拿到這個(gè)id值去服務(wù)器的session緩存中查找對(duì)應(yīng)session并返回。
1.2服務(wù)器在什么情況下創(chuàng)建session對(duì)象
調(diào)用request.getSession()方法可以獲得session對(duì)象,但并不是代表調(diào)用該方法服務(wù)器就會(huì)創(chuàng)建一個(gè)HttpSession對(duì)象,只有在一次會(huì)話中,第一次調(diào)用該方法時(shí)服務(wù)器才會(huì)創(chuàng)建一個(gè)session對(duì)象。
request.getSession()方法會(huì)查找請(qǐng)求信息中是否存在一個(gè)名為JSESSIONID的cookie,這個(gè)cookie是否存在會(huì)導(dǎo)致出現(xiàn)以下三種情況:
  • Cookie不存在:
Cookie不存在,說(shuō)明服務(wù)器還沒有為本次會(huì)話創(chuàng)建session對(duì)象,這時(shí)服務(wù)器會(huì)創(chuàng)建一個(gè)session對(duì)象,并把這個(gè)session對(duì)象保存在session緩存中,然后將session的id值保存在一個(gè)cookie中,再把這個(gè)cookie發(fā)送給瀏覽器。
  • Cookie存在,session的id值有對(duì)應(yīng)的session對(duì)象:
拿到該cookie的值,即session的id值,然后根據(jù)id值去session緩存中查找到了對(duì)應(yīng)的session對(duì)象,這時(shí)服務(wù)器不會(huì)重新創(chuàng)建session,而是將找到的session返回。
  • Cookie存在,session的id值沒有對(duì)應(yīng)的session對(duì)象:
根據(jù)session的id值在session緩存中沒有找到對(duì)應(yīng)的session對(duì)象,這時(shí)服務(wù)器創(chuàng)建新的session,并將新session的id值保存在一個(gè)cookie中,然后響應(yīng)給瀏覽器。
以上就是服務(wù)器創(chuàng)建session的對(duì)象的三種情況。另外,request對(duì)象還有其他兩個(gè)方法可以獲取session對(duì)象,分別是:
  • request.getSession(false):這個(gè)方法的作用是:從cookie中取出session的id值,但是該id值沒有對(duì)應(yīng)的session,服務(wù)器不再創(chuàng)建新的session對(duì)象,返回null;
  • request.getSession(true):該方法的作用和request.getSession()方法的作用一樣。
HttpSession對(duì)象有最大不活動(dòng)時(shí)間,默認(rèn)的最大不活動(dòng)時(shí)間是30分鐘,也就是說(shuō),如果session對(duì)象長(zhǎng)時(shí)間不被使用,30分鐘后這個(gè)session對(duì)象就會(huì)失效。

2.驗(yàn)證HttpSession對(duì)象創(chuàng)建時(shí)機(jī)

(1)創(chuàng)建一個(gè)web應(yīng)用,Example23,在該應(yīng)用下新建一個(gè)Servlet類,SessionServlet,該Servlet類的訪問(wèn)路徑為:“/SessionServlet“,主要代碼如例1-1所示:
例1-1 SessionServlet.java
public class SessionServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
          response.setContentType("text/html;charset=utf-8");
          response.getWriter().write("請(qǐng)查看是否有jsessionid這個(gè)cookie");
    }
}
例1-1中,因?yàn)橐驗(yàn)g覽器端響應(yīng)中文,因此要設(shè)置響應(yīng)信息編碼以防亂碼。
(2)將Example23發(fā)布到Tomcat服務(wù)器中,然后啟動(dòng)服務(wù)器,在瀏覽器地址欄上輸入:http://localhost:8080/Example23/SessionServlet,瀏覽器顯示結(jié)果如圖1-3所示:

圖1-3 瀏覽器顯示結(jié)果
(3)查看瀏覽器中保存的cookie信息,如圖1-4所示:

圖1-4 cookie信息
由圖1-4可知,該瀏覽器中并沒有一個(gè)叫JSESSIONID的cookie,也就是說(shuō)瀏覽器訪問(wèn)服務(wù)器端的SessionServlet,服務(wù)器并沒有創(chuàng)建session對(duì)象。因?yàn)樵赟essionServlet中并沒有調(diào)用request.getSession()方法。
(4)現(xiàn)在在瀏覽器端訪問(wèn)Example23應(yīng)用的index.jsp頁(yè)面,然后查看瀏覽器中的cookie信息,如圖1-5所示:

圖1-5 cookie信息
由圖1-5可知,訪問(wèn)index.jsp頁(yè)面后,瀏覽器中存在一個(gè)名為JSESSIONID的cookie,說(shuō)明服務(wù)器創(chuàng)建了一個(gè)session對(duì)象。我們并沒有在index.jsp頁(yè)面調(diào)用request.getSession()方法,服務(wù)器為什么就創(chuàng)建session對(duì)象了?因?yàn)閟ession是jsp頁(yè)面的內(nèi)置對(duì)象,服務(wù)器將jsp翻譯成Java文件后,在該Java文件中存在一句代碼,調(diào)用了getSession()方法。
(5)將瀏覽器中的cookie刪除,然后修改SessionServlet,如下所示:
public class SessionServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
          response.setContentType("text/html;charset=utf-8");
request.getSession();
          response.getWriter().write("請(qǐng)查看是否有jsessionid這個(gè)cookie");
    }
}
(6)重新啟動(dòng)服務(wù)器,在瀏覽器端訪問(wèn)SessionServlet ,然后查看瀏覽器的cookie信息,如圖1-6所示:

圖1-6 cookie信息
當(dāng)在SessionServlet中添加request.getSession()代碼,服務(wù)器就創(chuàng)建了session對(duì)象。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/javaee
0 分享到:
和我們?cè)诰€交談!