java中session的使用和總結

一、什麼是session?

session稱爲“會話控制”,Session 對象存儲特定用戶會話所需的屬性及配置信息。

二、session的機制是什麼?

在這裏插入圖片描述

當程序需要爲某個客戶端的請求創建一個session時,服務器首先檢查這個客戶端是否包含一個session標識(即JSESSIONID)。

如果是第一次請求服務器,服務器會創建session,並創建Cookie,在Cookie中保存Session的id,發送給客戶端,這樣客戶端就有了自己的session的id了。但這個Cookie只在瀏覽器內存中存在,也就是說,在關閉瀏覽器窗口後,Cookie就會丟失,也就丟失了sessionId。

如果是第二次請求服務器,會在請求中把保存的sessionId的Cookie發送給服務器,服務器通過sessionId查找session對象,然後給使用。也就是說,只要瀏覽器容器不關閉,無論訪問服務器多少次,使用的都是同一個session對象。這樣也就可以讓多個請求共享同一個session了。

當用戶關閉了瀏覽器窗口後,再打開瀏覽器訪問服務器,這時請求中沒有了sessionId,那麼服務器會創建一個session,再把sessionId通過Cookie保存到瀏覽器中,也是一個新的會話開始了。原來的session會因爲長時間無法訪問而失效(默認保留時間爲30分鐘)。

當用戶打開某個服務器頁面長時間沒動作時,這樣session會超時失效,當用戶再有活動時,服務器通過用戶提供的sessionId已經找不到session對象了,那麼服務器還是會創建一個新的session對象,再把新的sessionId保存到客戶端。這也是一個新的會話開始了。

使用session

創建和添加

HttpSession session = request.getSession();
session.setAttribute("customerInfo","1");

設置過期時長:

1.1:在主頁面或者公共頁面中加入:

session.setMaxInactiveInterval(15*60);

參數說明:單位秒,即在沒有活動15分鐘後,session將失效。如果設置的值爲零或負數,則表示會話將永遠不會超時。常用於設置當前會話時間。

注意:這個session設置的時間是根據服務器來計算的,而不是客戶端。所以如果是在調試程序,應該是修改服務器端時間來測試,而不是客戶端。

1.2:也是比較通用的設置session失效時間的方法,就是在項目的web.xml中設置

<session-config>  
  <session-timeout>15</session-timeout>  
</session-config> 

1.3:直接在應用服務器中設置,如果是tomcat,可以在tomcat目錄下conf/web.xml中

找到元素,tomcat默認設置是30分鐘,只要修改這個值就可以了。

優先級問題

上面的方法從高到低依次是1-2-3

刪除

session.invalidate();

首先,session 的作用域是在一個會話期間,多個用戶訪問服務器,就會有多個session,現在,我就假設有三個用戶A、B、C,他們訪問服務器,分別創建了三個Session,記爲S1,S2,S3.。
session.invalidate(),是某一個用戶調用的,比如說S1這個用戶,調用了這個方法,那麼,就只有s1用戶的session 被刪除,其他用戶的session,跟s1沒關係。
session.invalidate(),它實際上調用的是session對象中的destroy方法,也就是說你下次要再使用session,得再重新創建。 簡單的說,就是沒了,而不是值爲null
另外,有些情況下,登出並不一定是調用session.invalidate(),有時候,只是把綁定在session中某些數據給清空而已。
session.invalidate()是不能隨便調用的,一旦調用,就是所有的數據都會丟失。

session建議設置的時長

設置太長可能導致內存無法有效被回收。
一般來說,建議設置爲30(分鐘)就夠了,最長也儘量別超過60(分鐘)

session失效後做一些操作

(1)控制用戶數,當session失效後,系統的用戶數減少一個等,控制用戶數在一定範圍內,確保系統的性能。
(2)控制一個用戶多次登錄,當session有效時,如果相同用戶登錄,就提示已經登錄了,當session失效後,就可以不用提示,直接登錄了。
那麼如何在session失效後,進行一系列的操作呢?
這裏就需要用到監聽器了,即當session因爲各種原因失效後,監聽器就可以監聽到,然後執行監聽器中定義好的程序就可以了。
監聽器類爲:HttpSessionListener類,有sessionCreated和sessionDestroyed兩個方法
自己可以繼承這個類,然後分別實現。
sessionCreated指在session創建時執行的方法
sessionDestroyed指在session失效時執行的方法
給一個簡單的例子:

public class SessionListener implements HttpSessionListener{         
       public void sessionCreated(HttpSessionEvent event) {   
           HttpSession ses = event.getSession();   
           String id=ses.getId()+ses.getCreationTime();   
           SummerConstant.UserMap.put(id, Boolean.TRUE);     //添加用戶   
       }   
    
       public void sessionDestroyed(HttpSessionEvent event) {   
           HttpSession ses = event.getSession();   
           String id=ses.getId()+ses.getCreationTime();   
           synchronized (this) {   
              SummerConstant.USERNUM--;   //用戶數減一   
              SummerConstant.UserMap.remove(id); //從用戶組中移除掉,用戶組爲一個map   
           }   
       }   
}  

在web.xml中添加監聽

<listener>  
      <listener-class>  
             需監聽的類全名   
       </listener-class>  
</listener>  

session有什麼作用?

session是用來解決Http協議不能維持狀態的問題。session只存儲在服務器端的,不會在網絡中進行傳輸,所以session是相對安全的。session是依賴cookie的,當用戶訪問某一站點時,服務器會爲這個用戶產生唯一的session_id,並把這個session_id以cookie的形式發送到客戶端,以後的客戶端的所有請求都會自動攜帶這個cookie。

參考

java中的Session.

java session添加、獲取、設置時長與清除.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章