Servlet——Session(1)之基礎知識
Session之基礎知識
思考兩個問題:
1. 大家在網上買東西,張三和李四他們購買的商品不一樣,他們的購物車中顯示的商品也不一樣,這是怎麼實現的?
2. 不同的使用者登入網站後,不管該使用者瀏覽該網站的哪個頁面,都可以顯示登入人的名字,同樣可以隨時去檢視自己的購物車中的商品,這是怎麼實現的?
Session技術
Session是伺服器端技術,利用這個技術,伺服器在執行時可以為每一個使用者的瀏覽器建立一個其獨享的session物件,由於session為使用者瀏覽器獨享,所以使用者在訪問伺服器的web資源時,可以把各自的資料放在各自的session中,當用戶再去訪問伺服器中的其它web資源時,其它web資源再從使用者各自的session中取出資料為使用者服務。
當用戶開啟瀏覽器,訪問某個網站操作session時,伺服器就會在伺服器的記憶體為該瀏覽器分配一個session物件,該session物件被這個瀏覽器獨佔。
這個session物件也可以看做是一個容器,session預設存在時間為30min,你可以修改。
看如下示意圖:
Session可以用來做什麼
- 網上商城中的購物車
- 儲存登入使用者的資訊
- 將某些資料放入到Session中,供同一使用者的各個頁面使用
- 防止使用者非法登入到某個頁面!
如何理解Session
session不是特別好理解,你可以把session看做是一容器類似於HashMap,有兩列。每一行就是session的一個屬性。
每個屬性包含兩個部分,一個是該屬性的名字(String),另外一個是它的值(Object)
名字String | 值Object |
---|
那麼,如果同一個使用者瀏覽器,向session設定一個屬性的時候,如果名字相同,會出現什麼情況?
結論:跟Cookie一樣,這個值會更新,會替換為新的值
Session基本使用
- 得到session
// 返回這個request繫結的session物件,如果沒有,則建立一個
HttpSession session = request.getSession();
// 返回這個request繫結的session物件,如果沒有,則根據create的值決定是否建立一個
HttpSession session = request.getSession(boolean create)
2.向session中新增屬性
session.setAttribute(String name,Object val);
3.從session中得到某個屬性
String value = session.getAttribute(String name);
4.從session中刪除某個屬性
session.removeAttribute(String name);
可以做如下測試:
Servlet1生成session,並放入屬性,它的doGet方法:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//訪問session[當發現沒有session的時候,就會自動建立一個session]
HttpSession session = request.getSession();
// 給該session放入屬性
session.setAttribute("name", "小明");
session.setAttribute("age", "18");
//session的生命週期預設是30min,但是你也可以修改
//session.setMaxInactiveInterval(interval);
out.println("建立了session,並放入了兩個屬性,name和age");
}
從Chrome瀏覽器開啟Servlet1,可以看到結果:
Servlet2獲取session,並讀取屬性,它的doGet方法:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 獲取session
HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
String age = (String) session.getAttribute("age");
out.println("name:"+name+"age:"+age);
}
再從Chrome瀏覽器開啟Servlet2,可以看到結果:
這是在同一個瀏覽器中開啟的兩個不同的標籤頁,那麼如果我們換一個瀏覽器呢,比如換成MicroSoft Edge瀏覽器:
可以看到這時候name和age都是null,也就是沒有從session物件中取出值,因為Edge瀏覽器並沒有執行Servlet1來建立Session物件,上面的session物件是Chrome瀏覽器獨佔的。
要強調的是,因為session是存在於伺服器的記憶體中的,所以session物件的值也是可以存放物件的,並不像Cookie一樣,僅僅是字串!
比如,我們可以把一個User物件放入session物件中:
// 建立物件
User user = new User();
user.setName("小貓");
user.setColor("紅色");
session.setAttribute("cat", user);
之後,我們可以從session物件中取出這個User物件:
// 獲取User
User user = (User)session.getAttribute("cat");
Session生命週期
session中的屬性的預設生命週期是30min,這個預設時間可以通過修改web.xml檔案來修改
這樣修改:
1.在Tomcat根目錄\conf\web.xml檔案中修改:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
這樣修改會對所有的web應用生效。
2.如果只需要對某一個web應用設定,則只需要修改對應web應用的web.xml檔案。在這個web.xml檔案中新增如上的程式碼,比如你要設定為10分鐘,則新增:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
除了設定預設生命週期之外,最重要的是在程式中設定,呼叫setMaxInacttiveInterval(int interval)
,這裡的interval是以秒為單位的,而且這個方法設定的是發呆時間,比如你設定的是60秒,那麼在這60秒之內如果你沒有操作過session,它就會自動刪除,如果你操作過,不管是設定屬性還是讀取屬性,它都會從頭開始計時。
session.setMaxInactiveInterval(60);
這個應用很廣:比如我們逛購物網站,如果我們登入成功並且一直在操作、瀏覽網頁,那麼這個會話(Session)就一直保持,也就是我們一直處於登入狀態。而如果我們隔了一段時間沒有逛這個網站了,那麼再逛的時候就會看到自己是未登入狀態,因為會話(Session)已經過期了。
如果重啟Tomcat,或者reload自己的web應用,或者關機了,那麼web應用的session就會失效,這個結論很明顯,因為session是存在於伺服器的記憶體中的。
另外,我們也可以通過函式來讓session失效:invalidate()
,這個函式清除session,刪除一切會話。它通常用於安全退出某個網站。
要注意的是,
invalidate()
函式是清除所有session,如果你只要清除一個單個的屬性,那麼就要使用session.removeAttribute()
方法。
Session小結
1.session是存在伺服器的記憶體中的
2.一個瀏覽器獨享一個session域物件
3.session中可以存放多個屬性
4.session中可以存放物件
5.如果session設定的屬性存在重名,則會替換為新的值