1. 程式人生 > 其它 >2022.03.04第一次課堂測試總結

2022.03.04第一次課堂測試總結

Cookie、Session

1.會話

會話:使用者開啟一個瀏覽器,點選了很多超連結,同時訪問多個web資源,再到關閉瀏覽器,這個過程

有狀態會話:服務端給客戶端一個信件, 客戶端下次訪問服務端的時候帶上信件(Cookie);伺服器等級你來過了, 下次你來的時候匹配你(Session)

2.儲存會話的兩種技術

Cookie

  • ​ 客戶端技術(響應、請求)

Session

  • 伺服器技術、利用這個技術可以儲存使用者的資訊,可以把資訊或者資料放在Session中

常見場景:網站登入後第二次訪問不再登入

3.Cookie

伺服器先判斷該請求得cookie是否存在,若不存在則建立一個cookie,使用者在訪問時帶著cookie訪問

1.從請求中拿到資訊, 獲得Cookie

Cookie []cookies = req.getCookie();

2.伺服器響應給客戶端cookie

cookie.getName()  //獲得cookie中的key
cookie.getValue()  //獲得cookie中的value
new Cookie("cookieName", "cookieValue")  //新建一個cookie,如System.currentTimeMillion + ""
cookie.setMaxAge(24 * 60 * 60)  //設定cookie的有效期為1天
resp.addCookie(cookie)  //在響應中新增cookie

3.cookie一般會儲存在本地檔案AppData中

4.一個網站的cookie是否存在上限

  • 一個cookie只能儲存一個資訊
  • 一個web站點可以給瀏覽器傳送多個cookie, 每個站點最多存20個
  • 瀏覽器的上限為300個cookie
  • cookie大小有限制,4kb

5.刪除cookie

  • 不設定有效期,關閉瀏覽器自動失效
  • 設定有效期的時間為0
  • 建立一個新的同名的cookie,會自動覆蓋原有的cookie

6.如果在給網頁中文cookie出現亂碼

可以使用網路程式設計中的編碼、解碼的過程

URLEncoder.encode("content", "utf-8");  //編碼進行傳送
URLDecoder.decode("content", "utf-8");  //再次使用時需要解碼

7.記錄上次訪問時間程式碼

package com.Gw.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 java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;


//儲存使用者上一次訪問的時間
public class Cookie01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //伺服器告訴你你來的時間,然後把這個時間封裝為一個信件,下次帶著來
        resp.setContentType("utf-16");
        req.setCharacterEncoding("utf-16");
        resp.setCharacterEncoding("utf-16");

        PrintWriter out = resp.getWriter();
        //Cookie服務端從客戶端獲取, cookie可以存在多個
        Cookie[] cookies = req.getCookies();
        //判斷cookie是否存在
        if(cookies != null){
            //如果存在
            out.println("上一次訪問的時間是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie1 = cookies[i];
                //獲取cookie的名字
                if(cookie1.getName().equals("LastLoginTime")){
                    long lastLoginTime = Long.parseLong(cookie1.getValue());
                    Date date = new Date(lastLoginTime);
                    out.println(date.toLocaleString());
                }
            }
        }else {
            out.print("這是第一次訪問網站");
        }
        //伺服器給客戶端響應一個cookie
        Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");
        //有效期為一天
        cookie.setMaxAge(24 * 60 * 60);
        resp.addCookie(cookie);
    }

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

4.Session

cookie是將資料直接通過cookie傳回使用者,而session則是通過SessionID在

1.什麼是Session:

  • 伺服器會給每個使用者(瀏覽器)建立一個Session物件
  • 一個Session獨佔一個瀏覽器,只要瀏覽器不關,Session一直有效
  • 使用者登陸之後,所有子網頁都可以訪問

2.Session中常用的一些方法及使用:

//得到Session
HttpSession session = req.getSession();
//給Session中存東西,可以在不同網頁上進行存和取
session.setAttribute("obj", new Person("ygw", 20));
//從Session中取東西,注意需要強轉
Person person = (Person) session.getAttribute("obj");
//登出Session
session.removeAttribute("obj");
session.invalidate();
<!--在xml中登出Session的方法:會話自動過期-->
<!--設定session的失效時間-->
<session-config>
		<!--以分鐘為單位,15分鐘後session失效-->
        <session-timeout>15</session-timeout>
</session-config>

3.Session和Cookie的區別:

  • cookie是把使用者的資料寫給使用者的瀏覽器儲存
  • session把使用者的資料寫到使用者獨佔的session中,伺服器端儲存(儲存重要的資訊,減少伺服器資源的浪費)
  • session物件由伺服器建立

4.使用場景:

  • 儲存一個登陸使用者的資訊
  • 子網頁的訪問
  • 在整個專案中經常會使用的資料

5.一些參考程式碼:

package com.Gw.servlet;

import pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class Session01 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");
        //得到Session
        HttpSession session = req.getSession();
        //給Session中存東西
        session.setAttribute("obj", new Person("ygw", 20));
        //獲取session的id
        String id = session.getId();
        //判斷session是不是新建立
        if(session.isNew()){
            resp.getWriter().write("session建立成功, id:" + id);
        }else{
            resp.getWriter().write("session已經在伺服器中存在, id:" + id);
        }
        //Session建立的時候做了什麼事情 -> 本質上像一個cookie
        //Cookie cookie = new Cookie("JSESSIONID", "408EEFF1B5172C9AC61584CFD41023EC");
        //resp.addCookie(cookie);

    }

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

package com.Gw.servlet;

import pojo.Person;

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;

public class Session02 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        HttpSession session = req.getSession();
        Person person = (Person) session.getAttribute("obj");
        System.out.println(person.toString());
    }

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


package com.Gw.servlet;

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;

public class Session03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("obj");
        session.invalidate();
    }

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