1. 程式人生 > >servlet會話技術之session

servlet會話技術之session

引入:

    Cookie的侷限:

            1)Cookie只能存字串型別,不能儲存物件

            2)只能存非中文

            3)1個Cookie的容量不超過4KB

    如果要儲存非字串,超過4kb內容,只能使用session技術

        Session概念: Session是另一種記錄客戶狀態的機制,不同的是Cookie儲存在客戶端瀏覽器中,而Session儲存在伺服器上。客戶端瀏覽器訪問伺服器的時候,伺服器把客戶端資訊以某種形式記錄在伺服器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查詢該客戶的狀態就可以了。

        如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼Session機制就是通過檢查伺服器上的“客戶明細表”來確認客戶身份。Session相當於程式在伺服器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。

    Session的特點:會話資料儲存在伺服器端(記憶體中)
    Session技術核心:HttpSession類,用於儲存會話技術

        1)建立或得到session物件

                HttpSession.getSession( )

                HttpSession.getSession(boolean create)

        2)設定session物件

                void setMaxInactivelnterval(int interval); 設定session的有效時間

                void invalidate(); 銷燬session物件

                java.lang.String getId() 得到session編號

        3)儲存會話資料到session物件

                void setAttribute(java.lang.String name, java.lang.Object value); 儲存資料

                java.lang.Object getAttribute(java.lang.String name); 獲取資料

                void removeAttribute(java.lang.String name); 清除資料

        Session機制:除了使用Cookie,Web應用程式中還經常使用Session來記錄客戶端狀態。Session是伺服器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,相應的也增加了伺服器的儲存壓力

        Session技術則是服務端的解決方案,它是通過伺服器來保持狀態的。由於Session這個詞彙包含的語義很多,因此需要在這裡明確一下 Session的含義。首先,我們通常都會把Session翻譯成會話,因此我們可以把客戶端瀏覽器與伺服器之間一系列互動的動作稱為一個 Session。從這個語義出發,我們會提到Session持續的時間,會提到在Session過程中進行了什麼操作等等;其次,Session指的是伺服器端為客戶端所開闢的儲存空間,在其中儲存的資訊就是用於保持狀態。從這個語義出發,我們則會提到往Session中存放什麼內容,如何根據鍵值從 Session中獲取匹配的內容等。要使用Session,第一步當然是建立Session了。那麼Session在何時建立呢?當然還是在伺服器端程式執行的過程中建立的,不同語言實現的應用程式有不同建立Session的方法,而在Java中是通過呼叫HttpServletRequest的getSession方法(使用true作為引數)建立的。在建立了Session的同時,伺服器會為該Session生成唯一的Session id,而這個Session id在隨後的請求中會被用來重新獲得已經建立的Session;在Session被建立之後,就可以呼叫Session相關的方法往Session中增加內容了,而這些內容只會儲存在伺服器中,發到客戶端的只有Session id;當客戶端再次傳送請求的時候,會將這個Session id帶上,伺服器接受到請求之後就會依據Session id找到相應的Session,從而再次使用之。正式這樣一個過程,使用者的狀態也就得以保持了。

程式碼示例:
package com.session.demo;

/**
 * @Description Session底層原理:服務端建立了一個Session之後, 會在響應裡面將SessionId返回給客戶端
 *                              客戶端將SessionId儲存在本地磁碟, 再次請求的時候, 將SessionId通過
 *                              請求頭的方式傳給伺服器端.
 *              伺服器建立完session,會將SessionId通過請求頭的方式返回給客戶端
 *              客戶端將儲存在本地sessionId(請求頭)伺服器端, 伺服器就會去通過sessionId去查詢
 *              Session的值是存放在伺服器端的記憶體中
 *              session是存放在服務端上的, 只要沒達到失效時間, 是會一直存在的,
 *              當關閉瀏覽器時, 只是sessionId失效, 但session並沒有失效, 當再次開啟瀏覽器時, 又會建立一個新的sessionId
 * @author ShengLiu
 * @date 2018/7/8
 */
public class Session {

    public Session() {

    }
}
package com.session.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @Description 建立Session
 * @author ShengLiu
 * @date 2018/7/8
 */
@WebServlet("/createSession")
public class CreateSession extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 預設是true, 表示沒有Session, 就會建立一個Session. 如果為false, 表示如果沒有找到Session, 就不會建立一個Session
        HttpSession session = req.getSession();
        session.setAttribute("username", "shengliu");
        System.out.println("儲存session成功..." + session.getId());
    }
}package com.session.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @Description 獲取Session的值
 * @author ShengLiu
 * @date 2018/7/8
 */
@WebServlet("getSessionServlet")
public class GetSessionServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession(false);
        if (session != null){
            String username = (String) session.getAttribute("username");
            System.out.println("GetSessionServlet..." + username);
            System.out.println("sessionId: " + session.getId());
        }else {
            System.out.println("沒有找到任何結果...");
        }
    }
}