JavaWeb-Cookie基礎舉例

Cookie

1.會話

會話:指用戶打開了一個瀏覽器,點擊了很多超鏈接,訪問了多個Web資源,後關閉瀏覽器,這個過程可以稱之爲“會話”。

有狀態的會話:例如一個學生來過咱們班的教室,下次再來的時候,我們就能記住他來過。這個就是有狀態的會話。

Eg:

一個網站如何證明你來過?

客戶端<——>服務端

1.服務端會給客戶一個 信件,客戶端下次訪問的時候,帶上這個信件,就可以被認出來了。(Cookie)。

2.服務器登記你來過了,下次再訪問的時候,會自動匹配你(Session)。

2保存會話的兩種技術:

Cookie:

  • 客戶端技術(具有響應,請求)

Session:

  • 服務器技術,利用此技術,我們可以保存,用戶的會話信息,我們可以把信息或者數據放在Session中。

常見場景:

網站登錄後,關閉瀏覽器再打開此網頁,一般情況下第二次進入都不用再次登錄了,賬戶信息會被記住。

3.Cookie

總結:

1.從請求中拿到Cookie信息。

2.服務器響應給客戶端Cookie。

在這裏插入圖片描述

代碼總結:

Cookie[] cookies = req.getCookies();//Cookie的獲取。
	Cookie cookie = cookies[i];
	cookie.getName()//獲取Cookie中的Key
    cookie.getValue()//獲取Cookie中的Value
new Cookie("Last_LoginTime", System.currentTimeMillis() + "");//新建一個Cookie
	cookie.setMaxAge(24*60*60)//設置Cookie的有效期,這裏24*60*60表示一天
resp.addCookie(cookie);//響應給客戶端一個Cookie

舉例:

Servlet:

package com.edwin.servlet;

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 javax.xml.crypto.Data;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
 * @author Edwin D
 * @date 2020.6.6 上午 8:28
 */
//保存用戶上次訪問的時間
public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        服務器會保存你上次來時的時間,把這個時間封裝成一個信件,下次你帶來,就會知道是你來了。
//        解決中文亂碼問題
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");//解決網頁頁面亂碼

        PrintWriter out = resp.getWriter();

//        Cookie需要服務器從客戶端獲取。
        Cookie[] cookies = req.getCookies();
//        自動創建時用數組,說明Cookie可能存在多個。

//        判斷Cookie是否存在
        if (cookies != null) {
//            如果存在的操作
            out.write("上次訪問的時間爲:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie1 = cookies[i];
                if (cookie1.getName().equals("Last_LoginTime")) {
//                    獲取Cookie中的值
                    long Last_LoginTime = Long.parseLong(cookie1.getValue());
                    Date date = new Date(Last_LoginTime);
                    out.write(date.toLocaleString());
                    System.out.println("上次訪問的時間爲:"+date.toLocaleString());
                }
            }
        } else {
//            不存在的操作
            out.write("這是您第一次訪問本網站!");
        }

//        服務器給用戶響應一個Cookie
        Cookie cookie2 = new Cookie("Last_LoginTime", System.currentTimeMillis() + "");
        cookie2.setMaxAge(24*60*60);
        resp.addCookie(cookie2);
    }

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

Xml:

<servlet>
    <servlet-name>Cookie1</servlet-name>
    <servlet-class>com.edwin.servlet.CookieDemo01</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Cookie1</servlet-name>
    <url-pattern>/Cookie1</url-pattern>
</servlet-mapping>

輸出:

在這裏插入圖片描述

細節問題:

1.Cookie一般會保存在本地的用戶目錄下APPdata。

2.一個網站的Cookie是否存在上限?

  • 一個Cookie只能保存一個信息。

  • 一個Web站點可以給用戶瀏覽器發送多個Cookie,最多存放20個。

  • Cookie大小有限制:最大4KB。

  • 300個Cookie是瀏覽器的上限。

刪除Cookie:

1.不設置有效期,關閉瀏覽器後,會自動失效。

2.設置有效期爲:0,效果同上。

代碼:

Servlet:

package com.edwin.servlet;

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 javax.xml.crypto.Data;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * @author Edwin D
 * @date 2020.6.6 上午 10:22
 */
//保存用戶上次訪問的時間
public class CookieDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("Last_LoginTime", System.currentTimeMillis() + "");
        cookie.setMaxAge(0);//清除代碼。
        resp.addCookie(cookie);
    }

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

XML:

<servlet>
    <servlet-name>Cookie2</servlet-name>
    <servlet-class>com.edwin.servlet.CookieDemo02</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Cookie2</servlet-name>
    <url-pattern>/Cookie2</url-pattern>
</servlet-mapping>

操作前:

在這裏插入圖片描述

操作後:

在這裏插入圖片描述

編碼,解碼:

用於特殊情況下的亂碼解決。

//編碼
Cookie cookie = new Cookie("name", URLEncoder.encode("Edwin 段","Utf-8");
//解碼
out.write(URLEncoder.encode(cookie1.getValue(),"Utf-8");

參考文獻

《【狂神說Java】JavaWeb入門到實戰》

視頻連接

2020.06.07

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章