1. 程式人生 > 實用技巧 >會話技術------伺服器技術session

會話技術------伺服器技術session

概述:

客戶端會話技術cookie是儲存在客戶端瀏覽器的,那麼與之相對的伺服器端會話技術session是儲存在伺服器端的。

會話技術旨在資料的共享,下面一段session的程式碼演示:

@WebServlet("/servletSession01")
public class ServletSession01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
//獲取session物件 HttpSession session = request.getSession(); session.setAttribute("name","zhangsan"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }

資源類2:

@WebServlet("/servletSession02")
public class ServletSession02 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession();//獲取session String name = (String) session.getAttribute("name"); System.out.println(name); }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }

圖解session物件建立的傳遞過程:

    伺服器如何確保在一次會話範圍內多次獲取的session物件是同一個?

session在客戶端和瀏覽器之間的傳遞是依賴於cookie的

  • 在呼叫request方法的getsession();方法時:

    • 如果是本次會話第一次呼叫此方法
      • 那麼伺服器就會在記憶體中建立一個新的session物件
      • 並且會給這個記憶體的session物件分配id值(如上圖的742938a4289)
      • 在伺服器響應瀏覽器是會在響應頭中有set-cookie:JSESSIONID=742938a4289 (JSESSIONID是一個特殊的響應頭標記它代表的就是session依賴)
      • 瀏覽器再次訪問會在請求頭中含有cookie:JSESSIONID=742938a4289
      • 當本次會話再次請求獲得session物件是,會根據JSESSIONID尋找session物件記憶體地址
    • 如果不是本次會話中第一次
      •   重複第一次會話的最後兩個步驟

通過瀏覽器開發者模式驗證上面的說法:

第一次請求資源類1的響應頭:

第一次請求資源類2請求頭:

可以看出兩幅圖的JSESSIONID是相同的

判斷以下三種情況獲得的session物件是不是同一個物件:

  1. 客戶端關閉伺服器不關閉:
    •   不是同一個物件,因為session物件在客戶端和瀏覽器之間的會話是依賴於cookie物件的,如果關閉瀏覽器雖然session物件並不會被銷燬,但是它所依賴的cookie物件在瀏覽器端會被銷燬(預設情況下),多以再次訪問伺服器並不會含有上一次建立session物件的JSESSIONID的請求頭,所以伺服器會建立一個新的session物件
    • 希望瀏覽器關閉後還可以訪問到同一個session的解決辦法:
      •   設定一個cookie物件鍵為:JSESSIONID,值是session的記憶體id(通過session.getId();方法獲得),然後設定它的存活時間,就是可以找到相同session的時間間隔

程式碼如下:

@WebServlet("/servletSession02")
public class ServletSession02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();//獲取session
        String name = (String) session.getAttribute("name");
        Cookie cookie=new Cookie("JSESSIONID",session.getId());//手動設定依賴cookie
        cookie.setMaxAge(60*5);//設定依賴cookie的存活時間為5分鐘
        response.addCookie(cookie);
        System.out.println(name);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

    2.客戶端不關閉伺服器關閉:

      在idea中訪問的並不是同一個,但是在實際開發中這樣訪問的其實會是同一個session物件,原因是:

  • 如果是正常關閉伺服器,那麼在伺服器關閉之前會將記憶體中的session物件序列化(鈍化)到硬碟中
  • 然後再次啟動伺服器的時候就會將上次關閉時序列化的session物件重新活化到記憶體中

Session物件的失效時間:

  1. 伺服器關閉
  2. session物件的自殺方法:invalidate();
  3. session的預設失效時間是30分鐘(在Tomcat的主配置檔案web.xml中配置標籤

    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>

session的特點:

  1. session用於儲存一次會話的多次請求的多次請求的資料,儲存在伺服器。
  2. session可以儲存任意型別(指的是值,鍵只能String,cookie鍵值只能是String),任意大小的資料