1. 程式人生 > >JAVAWEB學習(7) - Session

JAVAWEB學習(7) - Session

Session

1. 什麼是Session

​ 伺服器端為了儲存使用者狀態而建立的一個特殊的物件

​ 在WEB開發中,伺服器可以為每個使用者瀏覽器建立一個會話物件(session物件),注意:一個瀏覽器獨佔一個session物件(預設情況下)。因此,在需要儲存使用者資料時,伺服器程式可以把使用者資料寫到使用者瀏覽器獨佔的session中,當用戶使用瀏覽器訪問其它程式時,其它程式可以從使用者的session中取出該使用者的資料,為使用者服務。

2. Session和Cookie的主要區別

首先了解幾個概念:

  1. 無狀態的HTTP協議

    協議是指計算機通訊網路中兩臺計算機之間進行通訊所必須共同遵守的規定或規則,超文字傳輸協議(HTTP)是一種通訊協議,它允許將超文字標記語言(HTML)文件從Web伺服器傳送到客戶端的瀏覽器。

    HTTP協議是無狀態的協議。一旦資料交換完畢,客戶端與伺服器端的連線就會關閉,再次交換資料需要建立新的連線。這就意味著伺服器無法從連線上跟蹤會話。

  2. 會話(Session)跟蹤

    會話,指使用者登入網站後的一系列動作,比如瀏覽商品新增到購物車併購買。

    會話(Session)跟蹤是Web程式中常用的技術,用來跟蹤使用者的整個會話

    常用的會話跟蹤技術是Cookie與Session。

所以它們有以下幾個區別:

  • Cookie通過在客戶端記錄資訊確定使用者身份,cookie資料存放在客戶的瀏覽器上

    Session通過在伺服器端記錄資訊確定使用者身份,session資料放在伺服器上

  • cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session

  • session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,考慮到減輕伺服器效能方面,應當使用cookie

  • 單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie

  • 可以考慮將登陸資訊等重要資訊存放為session,其他資訊如果需要保留,可以放在cookie中

3. Session工作原理

​ 當瀏覽器訪問伺服器時,伺服器建立session物件(該物件有一個唯一的id,一般稱之為sessionId),伺服器會將sessionId以cookie的方式傳送給瀏覽器。

​ 當瀏覽器再次訪問伺服器時,會將sessionId傳送過來,伺服器依據該sessionId找到對應的session物件。

...
response.setCharacterEncoding("UTF=8");
response.setContentType("text/html;charset=UTF-8");
//使用request物件的getSession()獲取session,如果session不存在則建立一個
HttpSession session = request.getSession();
//將資料儲存到session中
session.setAttribute("data", "username");
//獲取session的Id
String sessionId = session.getId();
//判斷session是不是新建立的
if (session.isNew()) {
	response.getWriter().print("session建立成功,session的id是:"+sessionId);
} else {
	response.getWriter().print("伺服器已經存在該session了,session的id是:"+sessionId);
}
...

4. 如何獲取session物件

  1. 方式一

    HttpSession session = request.getSession(boolean flag);
    

    HttpSession是一個介面,session物件是一個符合該介面的物件。

    • 當flag為true時

      先檢視請求當中有沒有sessionId,如果沒有則建立一個session物件。如果有sessionId則根據該sessionId查詢對應的session物件,如果找到了則返回該物件;如果找不到則建立一個新的session物件。

    • 當flag為false時

      先檢視請求當中有沒有sessionId,如果沒有返回null。如果有sessionId,則依據該sessionId查詢對應的session物件,如果找到了,則返回該session物件,沒找到則返回null。

    ![session](C:\Users\tarena\Desktop\學習筆記\Servlet & JSP\知識點\img\Session\session.png)

  2. 方法二

    //等價HttpSession session = request.getSession(true);
    HttpSession session = request.getSession();
    
  3. 常用方法

    //設定繫結值
    setAttribute(String name,Object obj);
    //根據name獲取繫結值
    Object getAttribute(String name);  //如果繫結名對應的值不存在,返回null
    //刪除session
    removeAttribute(String name);
    //獲取session的Id
    String getId();
    

5. 瀏覽器禁用Cookie後的session處理

  • 解決方案:URL重寫

    //用於對sendRedirect方法後的url地址進行重寫
    response.encodeRedirectURL(java.lang.String url);
    //用於對錶單action和超連結的url地址進行重寫
    response.encodeURL(java.lang.String url)
    

​ 所以,當瀏覽器禁用了cookie後,就可以用URL重寫這種解決方案解決Session資料共享問題。而且上面兩個方法是兩個非常智慧的方法,當檢測到瀏覽器沒有禁用cookie時,那麼就不進行URL重寫了。

6. session物件的建立和銷燬時機

6.1. session物件的建立時機

在程式中第一次呼叫request.getSession()方法時就會建立一個新的Session,可以用isNew()方法來判斷Session是不是新建立的

//使用request物件的getSession()獲取session,如果session不存在則建立一個
HttpSession session = request.getSession();
//獲取session的Id
String sessionId = session.getId();
//判斷session是不是新建立的
if (session.isNew()) {
    response.getWriter().print("session建立成功,session的id是:"+sessionId);
}else {
    response.getWriter().print("伺服器已經存在session,session的id是:"+sessionId);
}

6.2. session物件的銷燬時機

session物件預設30分鐘沒有使用,則伺服器會自動銷燬session,在web.xml檔案中可以手工配置session的失效時間,例如:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name> 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!-- 設定Session的有效時間:以分鐘為單位-->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>
</web-app>

當需要在程式中手動設定Session失效時,可以手工呼叫session.invalidate方法,摧毀session:

HttpSession session = request.getSession();
//手工呼叫session.invalidate方法,摧毀session
session.invalidate();

7. Session超時

  1. 什麼是session超時

    伺服器會將空閒時間過長的session物件刪除掉。

    伺服器預設的超時時間長度一般是30分鐘。

  2. 如何修改超時時間長度

    • 修改web.xml檔案中的配置

      <!-- 重啟生效 -->
      <session-config>
          <session-timeout>30</session-timeout>
      </session-config
      
    • 方法呼叫

      //兩次請求間的最大間隔
      setMaxInactiveInterval(int seconds)
      
  3. 立即刪除

    session.invalidate();
    

8. session驗證

  1. 在登陸成功之後,繫結一些資料到session物件上。比如:

    session.setAttribute("user",user);
    
  2. 當用戶訪問需要保護的資源時(即只有登入成功之後才能訪問的資源,比如,訪問success.jsp),進行session驗證

    Object user = session.getAttribute("user");
    if(user == null){
        //沒有登入
        response.sendRedirect("login.jsp");
    }