會話層技術-session

yzh先生發表於2024-10-20

會話層技術-session
session技術拿下!

一、先整理學習過程中的幾個疑惑

  1. cookie和session分別都是怎麼建立的?

    • 首先cookie是一個類,它需要java後端開發人員手動建立。
      Cookie cookies1 = new Cookie(keya, valuea);
    • 其次session是HttpSession介面的介面物件,它是由伺服器來建立的,注意這裡的建立不是指的是你在瀏覽器訪問網址的同時,他就建立了,而是在servlet重寫的service或doXXX方法中透過HttpSession session
      = request.getSession();或者HttpSession session = request.getSession(true);這兩種方式任一個建立的。
    • 注意:在預設訪問jsp檔案時,在你開啟網站的同時就建立了Session物件,這是因為jsp中預設設定為true,<%@ page session = "true"%>,當jsp檔案編譯生成.java程式碼後,裡面會有一句session = pageContext.getSession();所以,在tomcat啟動後預設訪問jsp頁面時,這條程式碼就幫你建立session了,本質上,還是要透過獲取session物件的時候判斷有沒有才會自動建立或者選擇之前的session物件。
  2. 藉助這個問題解決response.getWriter()獲取的物件是由是建立的?

    • response.getWriter()獲取的是PrintWriter型別的物件,當使用這條程式碼時候,伺服器(就是servlet容器)自動建立該型別的物件來向網頁上列印字串。
    • 可能又會有疑惑了,為什麼不直接new 一下建立這個物件啊!這個我透過搜尋整理,簡單理解為:response.getWriter()輸出的是流物件(所謂的流物件,就是列印結果可以輸出在頁面上),如果new PrintWriter()一個物件,再輸出就不會輸出到網頁上,而是idea的列印臺了,這僅僅是我自己的個人理解,便於我記憶!大家有好的可以給我分享,學習永無止境,哈哈!

二、ServletC用來實現session技術的處理過程

先簡單那介紹下session技術的處理流程:

  1. 使用者首次訪問伺服器,伺服器沒有Session,自動建立session物件和ID(這個ID相當於一個特殊的cookie,用於儲存每一個Session物件獨有的id值,他特殊就特殊在name = JSESSIONID, value = 這個id的值,普通的cookie的名字可以隨意起,值可以隨意更改,而由伺服器建立的這個Session物件的ID名字是固定的,值也是唯一的。
  2. 伺服器把這個特殊的cookie響應給客戶端,等到下次使用者訪問的時候,Servlet可以獲取到每個使用者獨有的JSESSIONID值,從而對資料進行儲存記錄。

三、ServletC程式碼具體要怎麼實現呢

  1. 首先我要透過request物件呼叫getParameter()方法來獲得訪問伺服器的使用者資訊。
  2. 緊接著,我呼叫request物件的getSession()方法來判斷(是透過JSESSIONID的值來判斷的)是否該使用者是之前已經建立過的session,若是則不再重新建立,直接獲取,若否,則自動重新建立並獲取。
  3. 之後,我把獲取到的使用者資訊存入Session物件中(相當於個人檔案)。
  4. 最後,透過response物件向客戶端響應JSESSIONID的值(特殊的cookie)。

具體程式碼實現如下:

package com.atguigu.servlet;

import com.sun.deploy.net.cookie.CookieUnavailableException;

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;

@WebServlet(name = "ServletC", urlPatterns = "/ServletC")
public class ServletC extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


        //接收請求中的使用者引數的值,接收姓名
        String username1 = req.getParameter("username");//呼叫req物件的getParameter方法獲得usrname引數的值
        //該方法傳入引數名,獲得引數值

        //建立Session物件
        HttpSession session1 = req.getSession();//具體含義上述已說

        //把使用者資訊存入Session物件中
        session1.setAttribute("username", "yzh");
        //檢視該Session物件的JSESSION值
        String id01 = session1.getId();
        System.out.println("JSESSIONID = " + id01);
        //響應使用者資訊
        resp.getWriter().println("已響應");
    }
}

四、ServletB來獲取已經建立的session物件儲存的使用者資訊

我已經透過ServletC將使用者資訊存入建立的Session,那怎麼來透過下次的訪問,根據特殊的cookie來識別使用者,並把使用者資訊提取列印出來呢?ServletB給我們答案(小嘲:有點小風範啊!哈哈)

package com.atguigu.servlet;

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;

@WebServlet("/ServletD")
public class ServletD extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session2 = req.getSession();//再次判斷session是否已經存在,已經存在,直接瞄準他
        System.out.println("上個session的id值是:" + session2.getId());
        String username2 = (String)session2.getAttribute("username1");//呼叫getAttribute()方法得到該使用者的屬性值
        resp.getWriter().println(username2);//來吧,展示!
    }
}

讓我們每天進步一點點,穩才是長遠之道!

相關文章