1. 程式人生 > >【每日一學190801】session基礎

【每日一學190801】session基礎

session簡介

之前講過cookie,但是cookie是儲存在客戶端瀏覽器的,如果敏感資訊使用cookie來儲存會造成安全隱患,所以cookie在某些場景下是不適合的,此時可以使用session。

session技術也是用於儲存使用者在請求中的一些重要資訊,但是session技術與cookie的不同點在於session是針對使用者請求的,在服務端建立一個物件,然後把使用者的請求中重要的資料儲存在服務端建立的這個物件中。(sesion是儲存在服務端中)因此只有使用者不關閉瀏覽器,使用者通過當前的個瀏覽器訪問當面網站中任何一個頁面,伺服器內部始終將使用當前這個session來記錄資料,所以可以將session當做一個容器,針對當前使用者(瀏覽器)來存放不同頁面上需要共享的資料。

在web專案中,伺服器可以為每一個使用者瀏覽器建立一個會話物件(session物件),在預設情況下,一個瀏覽器是獨佔一個session物件的,因此在需要保護使用者資料時,伺服器程式可以把使用者資料解除安裝使用者瀏覽器獨佔的session中,當用戶使用瀏覽器訪問其他程式時,其他程式可以從使用者的session中取出該使用者的資料。

session圖

三大域物件

session是一個域物件,所謂的域可以理解為有邊界的容器,既然是容器那麼就可以存放東西,這裡就是存放資料,既然有邊界,就是這裡的資料在某一個範圍內是有效果。下面比較一下web專案中的三個域物件:

  • ServletContext:代表的是整個專案,裡面儲存的資料可以在當前專案的任何一個程式中使用
  • HttpServletRequest: 代表的是當前這個請求,在轉發的時候(因為轉發是同一個請求,但是重定向就不是)可以將當前請求中儲存的資料轉給下一個servlet或者jsp進行處理
  • HttpSession:代表的是使用者(瀏覽器)對當前伺服器的一系列操作時的那個容器,可以在當前每一個使用者(瀏覽器)內部進行資料的共享操作。

session常用的一個場景

登入成功後將登陸的資訊放到session中,然後在使用者操作其他的頁面後,都可以顯示使用者的資訊。

獲取session物件

可以通過HttpServletRequest物件來獲取session,有兩個方法可以獲取

  • request.getSession()
    • 如果sesion不存在,則會建立
    • 如果session已經存在,就會返回當前這個session物件
  • request.getSession(boolean)
    • 引數為true則和getSession()方法的效果是一樣的
    • 引數為false
      • 如果session物件存在,則返回當面的sesion物件
      • session物件不存在,不會建立session,而是返回一個null

JsessionId

每一個使用者都可以有自己的session資訊,那麼伺服器怎麼識別每一個使用者的session物件呢?其實是因為伺服器針對每一個使用者都發送了一個key為JSEESSIONID的cookie資訊,使用者在操作的時候,都會攜帶這個cookie到伺服器,這樣伺服器才可以識別針對當前的這個JSESSIONID的那個session物件。

瀏覽器中關閉後session不能使用

伺服器在給客戶端響應資料的時候,把session物件的jsessionId作為cookie的key值傳送給瀏覽器,這個cookie是會話級別的(臨時的),該cookie只可以存在於瀏覽器執行期間,如果瀏覽器關閉了,cookie的資訊就沒有了,當再一次開啟瀏覽器的時候,就不會再伺服器獲取當前使用者的jsessionid資訊,無法找到針對當前使用者的那個session容器,所以瀏覽器關閉