[05] Session概要
生活随笔
收集整理的這篇文章主要介紹了
[05] Session概要
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、Session是什么
除了使用Cookie,Web應用程序中還經常使用Session來記錄客戶端狀態,即Session是服務器端使用的一種保存客戶端狀態的機制。Cookie在客戶端,Session在服務器端。圍繞以上的概念來說,其實Session還包含不同的語義:
(1)Session會話我們通常都會把Session翻譯成會話,因此我們可以把客戶端瀏覽器與服務器之間一系列交互的動作稱為一個 Session。即客戶端向服務器發送請求,服務器接收請求并生成響應返回給客戶端,這樣一次連續的調用過程。
從這個語義出發,就涉及到所謂Session持續的時間,以及Session過程中發生了什么操作等。
(2)Session作用域其次,Session指的是服務器端為客戶端所開辟的存儲空間,在其中保存的信息就是用于保持狀態。
從這個語義出發,則涉及到Session中存放什么內容,如何根據鍵值從Session中獲取匹配的內容等。
(Session的實現機制,以及和Cookie的區別,存在的價值,本篇暫不展開,會在后面的文章中單獨拿出來解釋)
2、HttpSession接口
在Servlet API中,定義了HttpSession接口,用來封裝會話對象。2.1 會話對象的獲取
因為該接口類型的對象是由容器創建的,所以不能直接使用new進行創建,而要使用HttpServletRequest中的方法進行獲取:- public HttpSession getSession() ?獲取當前請求相關的Session,若不存在則新建后返回
- public HttpSession getSession(boolean create)? 若參數為true,則等同getSession();若為false,則Session不存在時返回null,而不會新建
下面是HttpSession接口中定義的部分方法:
| 返回值? ?? | 方法名? ?? | 說明 |
| void? ?? | setAttribute(String key, Object value) | 以key/value的形式保存對象值? ?? |
| Object? ?? | getAttribute(String key) | 通過key獲取對象值 |
| void? ?? | removeAttribute(String key) | 通過key刪除屬性 |
| int? ?? | getMaxInactiveInterval()? ?? | 獲取session的有效非活動時間,以秒為單位 |
| void? ?? | setMaxInactiveInterval(int interval) | 設置session的最大非活動時間,以秒為單位,超時則銷毀 |
| String? ?? | getId()? ?? | 獲取session對象的編號 |
| void? ?? | invalidate() | 設置session對象失效 |
| boolean? ?? | isNew()? ?? | 判斷一個session是不是一個新創建的會話對象 |
HttpSession中定義了三個與屬性相關的方法,get / set / remove Attribute,分別用來 獲取 / 設置 / 刪除 屬性。
這三個方法的聲明和 HttpServletRequest 中與屬性相關的方法是相同的,主要區別在于:
- 有效范圍不同
- 請求中的屬性只在當前請求內有效,只有通過轉發才能把當前請求對象轉發到下個資源
- 會話屬性在會話對象中有效,即客戶端和服務器連接后,只要沒有關閉瀏覽器,服務器也正常,則在該次會話中屬性一直有效
另,由于會話對象有效時間長,安全性相對較低,所占資源較多。所以,請求屬性能解決的問題,就用請求對象,必須時才使用會話。
2.2 會話失效
會話對象是容器創建的,并保存在容器中。若客戶端連接到服務器后卻置之不理,不做任何操作,那么容器維護這些會話對象將占用很多資源。因此,容器會在會話對象閑置默認時間后銷毀會話對象,多數容器默認30min銷毀會話對象。所謂閑置,就是沒有使用Session對象。
有三種方式配置會話的失效時間:
(1)在web.xml中配置,如下圖配置閑置50min銷毀<session-config> <session-timeout>50</session-timeout> </session-config>31<session-config> 2 ? ?<session-timeout>50</session-timeout>3</session-config>
(2)使用setMaxInactiveInterval設置最長有效時間HttpSession接口提供了setMaxInactiveInterval方法用以設定session的有效時間,以秒為單位,若形參為負數,則表示永不失效。
如設置會話有效時長為2小時:protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("doGet() running...");HttpSession session = request.getSession();session.setMaxInactiveInterval(2*60*60); }1protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {2 ? ?System.out.println("doGet() running...");3 ? ?HttpSession session = request.getSession();4 ? ?session.setMaxInactiveInterval(2*60*60);5}
如果用以上兩種方式同時設置Session的有效時間,則以設定的較小的時間為準。
需要注意的是,上面這兩種方式還是有區別的:
- web.xml中配置有效時間是針對當前應用下的所有session,而setMaxInactiveInterval方法只是針對單獨的某個session對象
- web.xml中設置時間單位是min,而setMaxInactiveInterval設置時間單位是sec
(3)使用invalidate立即失效除了根據有效時間使會話失效之外,還可以調用HttpSession中的invalidate方法,使會話立即失效。
我們在涉及賬戶登錄后常常用到session保存部分用戶信息,在用戶選擇登出時,就要使用invalidate讓session失效,以保證用戶信息安全,同時提高服務器的效率。
轉載于:https://www.cnblogs.com/deng-cc/p/7462894.html
總結
以上是生活随笔為你收集整理的[05] Session概要的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高可用。。。
- 下一篇: 用花生壳搭建个人简易静态网站