JavaWeb學習之路(四):Cookie&Session

2020-08-11 18:27:11

一、Cookie餅乾

1. 什麼是Cookie

  1. Cookie是伺服器通知用戶端儲存鍵值對的一種技術
  2. 用戶端有了Cookie後,每次請求都發送給伺服器
  3. 每個Cookie的大小不能超過4kb

2. 如何建立Cookie

在这里插入图片描述

    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 建立Cookie物件
        Cookie cookie = new Cookie("key1","value1");
        // 2. 通知用戶端儲存Cookie
        resp.addCookie(cookie);

        resp.getWriter().write("cookie建立成功");
    }

3. 如何獲取Cookie

伺服器獲取用戶端的Cookie只需要一行程式碼:req.getCookie(),就會返回Cookie的陣列Cookie[]
在这里插入图片描述

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        Cookie[] cookies = req.getCookies();

        for (Cookie c:cookies
             ) {
            //getName:返回Cookie的key值
            //getValue:返回Cookie的Value值
            resp.getWriter().write("Cookie[" + c.getName() + "=" + c.getValue()+"]</br>");
        }
    }

4. Cookie值的修改

方案一

  1. 先建立一個要修改的同名的Cookie物件
  2. 在構造器,同時賦予新的Cookie值
  3. 呼叫response.addCookie(cookie)
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       // 1. 先建立一個要修改的同名的Cookie物件
       // 2. 在構造器,同時賦予新的Cookie值
        Cookie cookie = new Cookie("key1","allValue");
       // 3. 呼叫response.addCookie(cookie)
        resp.addCookie(cookie);

        resp.getWriter().write("key1的cookie值已經修改好了");
    }

方案二

  1. 先查詢到需要修改的Cookie物件
  2. 呼叫setValue()方法賦予新的Cookie值
  3. 呼叫response.addCookie(cookie)通知用戶端進行儲存
 protected void updateCookie2(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1. 先查詢到需要修改的Cookie物件
        Cookie cookie = CookieUtils.findCookie("key1",req.getCookies());
        //2. 呼叫setValue()方法賦予新的Cookie值
        if (cookie != null){
            cookie.setValue("values");
        }
        //3. 呼叫response.addCookie(cookie)通知用戶端進行儲存
        resp.addCookie(cookie);
    }

5. Cookie生命控制

Cookie的生命控制指的是如何管理Cookie什麼時候被銷燬(刪除)

  • setMaxAge():
    1. 正數:表示在指定的秒數後過期
    2. 負數:表示瀏覽器一關,Cookie就會被刪除(預設的值是負一)
    3. 零:表示馬上刪除Cookie
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("default","value2");
        cookie.setMaxAge(-1);
        resp.addCookie(cookie);
    }

    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("deleteNow","value2");
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }

    protected void second(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("30second","value2");
        cookie.setMaxAge(30);
        resp.addCookie(cookie);
    }

6.Cookie有效路徑Path的設定

Cookie的path屬性可以有效的過濾哪些Cookie可以發送給伺服器,哪些不發送。path屬性是通過請求的地址來進行有效的過濾
在这里插入图片描述

7. Cookie練習——免輸入使用者名稱登錄

在这里插入图片描述

package com.zc.servlet;

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

/**
 * @author ZC
 * @Description
 * @date 2020-08-10 23:08
 */
@WebServlet(name = "LoginServlet")
public class LoginServlet extends BaseServlet {
    protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("zc".equals(username) && "123".equals(password)){
            System.out.println("登錄城功夫");
            Cookie cookie = new Cookie("username",username);
            cookie.setMaxAge(60*60*24*7);
            response.addCookie(cookie);
        }else{
            System.out.println("登錄失敗");
        }
    }

}


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <base href="http://localhost:8080/13_cookie_session/">
</head>
<body>
    <form action="login?action=login" method="post" >
        使用者名稱:<input type="text" name="username" value="${cookie.username.value}"></br>
        密碼:<input type="password" name="password" > </br>
        <input type="submit" value="登錄">
    </form>

</body>
</html>

二、Session

1. 什麼是Session對談

  1. Session就是一個介面(HttpSession)
  2. Session就是對談,它是用來維護一個用戶端和伺服器之間關聯的一種技術
  3. 每個用戶端都有自己的一個Session對談
  4. Session對談中,通常用來儲存使用者登錄之後的資訊

2. 如何建立一個Session和獲取(id號是否爲新)

  1. 如何建立和獲取Session。它們的API是一樣的
    • request.getSession()
      第一次呼叫是:建立Session對談
      之後呼叫都是:獲取之前的Session對談
    • isNew():判斷到底是不是剛建立出來的對談
      true:表示剛建立
      false:表示獲取之前建立的
  2. 每個對談都有一個身份證號。也就是Id值。而且這個ID是唯一的。
    getId()得到Session的對談Id值。

protected void createOrGetSeassion(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        boolean isNew = session.isNew();
        String id = session.getId();
        resp.getWriter().write("得到的Session,它的Id是"+id+"\n是不是新建立的:"+isNew);     
    }

3. Session域數據的存取

protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getSession().setAttribute("key1", "value1");
        resp.getWriter().write("已經往Session中儲存了數據");

    }
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object attribute = req.getSession().getAttribute("key1");
        resp.getWriter().write("從Session中獲取出key1的數據是:" + attribute);
    }

4. Session生命週期控制

  • public void setMaxInactiveInterval(int interval):設定Session的超時時間(以秒爲單位),超過指定的時長,Session就會被摧毁。
  • public int getMaxInactiveInterval() :獲取Session的超時時間
  • Session的預設超時時長爲30分鐘
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • session.invalidate():讓對談馬上超時

注意:
session的超時指的是,用戶端兩次請求的最大時間間隔
在这里插入图片描述

5. 瀏覽器和伺服器Session之間關聯的技術內幕

Session技術,底層其實是基於Cookie技術實現的
在这里插入图片描述