首頁 > 軟體

淺談Servlet的Cookie和Session機制

2021-05-17 13:03:31

一、Servlet Cookies

Cookies定義:Cookies是儲存在使用者端計算機上的文字檔案,並保留了使用者的各種跟蹤資訊。

Cookies作用:對談保持,如完成使用者的登入與狀態保持

Cookies的工作原理

使用者端向服務區發起登入請求

伺服器指令碼(程式碼)向瀏覽器傳送一組Cookies,例如:姓名,年齡等

瀏覽器將這些資訊儲存在本地計算機上,以備將來使用

當下一次瀏覽器向web伺服器傳送任何請求時。瀏覽器會把這些Cookies資訊傳送到伺服器,伺服器將使用這些資訊來識別賬戶

1.1 Cookies構成

Cookies通常設定在HTTP頭資訊中,設定Cookie的http請求,會向Servlet傳送如下資訊

  • Set-Cookie頭包含了一個名稱值對,一個GMT日期,一個路徑和一個域,名稱和值都會被URL編碼
  • expires欄位是一個命令,告訴瀏覽器在給定的時間和日期之後過去(「忘記」)該Cookie
  • 如果瀏覽器被設定為儲存Cookies,他將會保留此資訊知道到期日期

如果使用者端的瀏覽器指向任何匹配該Cookie的路徑和域的頁面,他會重新傳送Cookie到伺服器,瀏覽器的頭資訊可能會如下:

此時Servlet就能夠通過請求方法request.getCookies()存取Cookie,該方法將返回一個Cookie物件的陣列

1.2 Servlet操作Cookie方法

1.3 程式碼範例:

具體步驟,建立兩個後端類,分別為:

  • 設定cookie資訊
  • 獲取cookie資訊

設定cookie資訊程式碼

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class SetCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.建立Cookie物件
        //首先需要一個cookie物件,這裡我們需要兩個cookie物件,一個來儲存使用者名稱(username——java),一個來儲存密碼(pwd——javas)
        Cookie username = new Cookie("uesrname","java");
        Cookie pwd = new Cookie("pwd","javas");
        //當我們建立好兩個cookie物件之後,就可以對這兩個物件進行一系列操作
        //比如:設定他的過期時間,這裡我們將username的過期時間設定為永久
        username.setMaxAge(-1);
        //密碼pwd的過期時間設定為一分鐘,注意他的過期時間是以秒為單位
        pwd.setMaxAge(60);
        //2.將 Cookie 物件關聯到response上
        resp.addCookie(username);
        resp.addCookie(pwd);

        //顯示給使用者部分的資訊
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        //然後寫入響應給使用者端的內容
        PrintWriter writer = resp.getWriter();
        writer.println("<h1>Cookie 設定成功</h1>");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

注意:一定不要忘記設定web.xml檔案

結果驗證:


獲取cookie資訊程式碼

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class GetCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //讀取Cookie的資訊
        //因為使用者端的cookie可能會有多個,所以我們使用陣列來接收,注意:cookie是從request獲取的
        Cookie[] cookies = req.getCookies();
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        PrintWriter writer = resp.getWriter();
        //然後讀取cookie的內容
        for (Cookie item: cookies
             ) {
            writer.println(String.format("<h1>Cookie key: %s,Cookie value: %s</h1>",item.getName(),item.getValue()));
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

注意
1.不要忘記設定web.xml檔案
2.因為上面我們設定cookie資訊的時候,pwd的過期時間為一分鐘,當我們要去獲取cookie資訊的時候就看時間不夠,所以建議修改更長的過期時間。

1.4 驗證結果

二、Servlet Session

Session定義:session是儲存在伺服器上的文字檔案,並保留使用者的各種跟蹤資訊
Session作用:對談保持,如完成使用者的登入與狀態保持,因為在伺服器端,所以相對安全一些。

Session在Servlet裡的儲存形式

2.1 Servlet操作session方法

session是藉助cookie實現的

HttpSession物件

  • Servlet提供了HttpSession介面,該介面提供了一種跨多個頁面請求或存取網站時識別使用者以及儲存有關使用者資訊的方式
  • Servlet容器使用這個介面來建立一個HTTP使用者端和HTTP伺服器之間的session對談,對談持續一個指定的時間段。跨多個連線或頁面請求
  • 可以通過呼叫HttpServletRequest的公共方法 getSession() 來獲取 HttpSession物件(如:HttpSession session = request.getSession()),需要在向用戶端傳送任何檔案內容之前呼叫 request.getSession()

HttpSession 物件中可用的幾個重要的方法:


小知識點:session都是通過request進行操作,而cookie是通過request和response進行操作。

2.2 程式碼範例

關於session的讀寫操作程式碼

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //關於 session 的讀寫
        //1.先獲取到session到物件
        HttpSession session = req.getSession();

        //2.得到session的屬性
        //2.1獲取到session的ID
        String sessionID = session.getId();


        //返回響應資訊
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("<h1>歡迎存取頁面</h1>");
        //輸出sessionID
        writer.println(String.format("<h3>SessionID : %s </h3>",sessionID));
        //輸出session的建立時間,因為session的建立時間是一個時間戳,所以我們需要將其強轉成我們能看得懂的時間
        writer.println(String.format("<h3>Session建立時間: %s</h3>",new Date(session.getCreationTime())));
        //輸出session的最後存取時間
        writer.println(String.format("<h3>Session的最後存取時間: %S</h3>",new Date(session.getLastAccessedTime())));
        
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

2.3 驗證結果

到此這篇關於淺談Servlet的Cookie和Session機制的文章就介紹到這了,更多相關Servlet的Cookie和Session內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com