App下載

簡單聊聊Java Servlet中的Cookie和Session機制

來源: 有啤酒肚的仙女 2021-08-18 11:06:31 瀏覽數 (2030)
反饋

一、Servlet Cookies

Cookies定義:Cookies是存儲在客戶端計算機上的文本文件,并保留了用戶的各種跟蹤信息。

Cookies作用:會話保持,如完成用戶的登錄與狀態(tài)保持

Cookies的工作原理

客戶端向服務區(qū)發(fā)起登錄請求

服務器腳本(代碼)向瀏覽器發(fā)送一組Cookies,例如:姓名,年齡等

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

當下一次瀏覽器向web服務器發(fā)送任何請求時。瀏覽器會把這些Cookies信息發(fā)送到服務器,服務器將使用這些信息來識別賬戶

1.1 Cookies構成

Cookies通常設置在HTTP頭信息中,設置Cookie的http請求,會向Servlet發(fā)送如下信息

在這里插入圖片描述

  • Set-Cookie頭包含了一個名稱值對,一個GMT日期,一個路徑和一個域,名稱和值都會被URL編碼
  • expires字段是一個命令,告訴瀏覽器在給定的時間和日期之后過去(“忘記”)該Cookie
  • 如果瀏覽器被配置為存儲Cookies,他將會保留此信息知道到期日期

如果用戶端的瀏覽器指向任何匹配該Cookie的路徑和域的頁面,他會重新發(fā)送Cookie到服務器,瀏覽器的頭信息可能會如下:

在這里插入圖片描述

此時Servlet就能夠通過請求方法request.getCookies()訪問Cookie,該方法將返回一個Cookie對象的數組

1.2 Servlet操作Cookie方法

在這里插入圖片描述

1.3 代碼示例:

具體步驟,創(chuàng)建兩個后端類,分別為:

  • 設置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.創(chuàng)建Cookie對象
        //首先需要一個cookie對象,這里我們需要兩個cookie對象,一個來存儲用戶名(username——java),一個來存儲密碼(pwd——javas)
        Cookie username = new Cookie("uesrname","java");
        Cookie pwd = new Cookie("pwd","javas");
        //當我們創(chuàng)建好兩個cookie對象之后,就可以對這兩個對象進行一系列操作
        //比如:設置他的過期時間,這里我們將username的過期時間設置為永久
        username.setMaxAge(-1);
        //密碼pwd的過期時間設置為一分鐘,注意他的過期時間是以秒為單位
        pwd.setMaxAge(60);
        //2.將 Cookie 對象關聯(lián)到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作用:會話保持,如完成用戶的登錄與狀態(tài)保持,因為在服務器端,所以相對安全一些。

Session在Servlet里的存儲形式

在這里插入圖片描述

2.1 Servlet操作session方法

session是借助cookie實現的

HttpSession對象

  • Servlet提供了HttpSession接口,該接口提供了一種跨多個頁面請求或訪問網站時識別用戶以及存儲有關用戶信息的方式
  • Servlet容器使用這個接口來創(chuàng)建一個HTTP客戶端和HTTP服務器之間的session會話,會話持續(xù)一個指定的時間段。跨多個連接或頁面請求
  • 可以通過調用HttpServletRequest的公共方法 getSession() 來獲取 HttpSession對象(如:HttpSession session = request.getSession()),需要在向客戶端發(fā)送任何文檔內容之前調用 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的創(chuàng)建時間,因為session的創(chuàng)建時間是一個時間戳,所以我們需要將其強轉成我們能看得懂的時間
        writer.println(String.format("<h3>Session創(chuàng)建時間: %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 驗證結果

在這里插入圖片描述

到此這篇關于Java Servlet中的Cookie和Session機制的文章就介紹到這結束了,還想要了解更多關于Java Servlet的內容,可以搜索W3Cschool以前相關內容的文章,也可以持續(xù)關注接下來的內容,希望大家可以多多支持!


0 人點贊