JavaWeb----Cookie和Session的異同

前言

談到Cookie和Session,我們就得先了解一下會話這個概念。那麼網絡上的一次會話定義是什麼呢?
會話:用戶打開一個瀏覽器,點擊了很多超鏈接,訪問多個web資源,關閉瀏覽器,這個過程稱之爲會話。
有狀態會話:給一次會話加上標誌位,證明他來過。舉一個現實生活中的例子,一個同學來到教室,下次同學再來教室,我們就知道這個同學曾經來過,這就稱之爲有狀態會話。

每篇無獎問答:
我們該如何證明你是某個學校的學生呢?
你 學校
這其實無外乎兩種方式:一種是學校給你一張繳費單,上面有你的相關信息,你進入學校後,可以把它作爲你身份的憑證。
另外一種是學校對你的信息進行登記,就像你在班級裏都有一個固定的學號信息,這就是你身份的·憑證。
繼續思考一下,一個網站又如何證明你來過呢(類比學校和你的關係)
客戶端 服務器

  1. 服務端給客戶端一個信件(類似於繳費單),客戶端下次訪問服務器帶上信件就可以了。(這就是所謂的cookie)
  2. 服務端登記你來過(相當月學號信息),下次你來的時候我來匹配你。(這就是所謂的session)

上面的例子我們可以做出如下總結:
網絡上保存會話有兩種技術:
Cookie : 客戶端技術 (響應,請求)
Session: 服務端技術,利用這個技術,可以保存用戶的會話信息。
常用場景:網站登錄之後,你下次不用再登錄,第二次直接就登上去了。

1. Cookie

在這裏插入圖片描述
用戶第二次可以免登陸的原因:
[1] 服務器 從客戶端的請求中拿到cookie信息
[2] 服務端響應客戶端的cookie信息

Cookie的主要方法
(其中req表示request對象,resp表示response對象)

Cookie[] cookies = req.getCookies(); //獲得Cookie
cookie.getName();                    //獲得cookie中的key
Cookie cookie  = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //新建一個cookie對象
cookie.setMaxAge(24*60*60);          //設置cookie的有效期
resp.addCookie(cookie);              //響應給客戶端一個cookie

以一個設置cookie的有效期爲例子

package com.gs.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;

/**
 * @Auther: Gs
 * @Date: 2020/5/16
 * @Description: PACKAGE_NAME
 * @version: 1.0
 */
public class CookieDemo02 extends HttpServlet {

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

        //服務器給客戶端響應一個Cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        //cookie有效期爲1天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);

    }

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

記得寫完cookie後都要進行註冊,因爲它本質上是一個Servlet類
在web.xml上進行註冊

<servlet>
    <servlet-name>CookieDemo02</servlet-name>
    <servlet-class>com.gs.servlet.CookieDemo02</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>CookieDemo02</servlet-name>
    <url-pattern>/cookie2</url-pattern>
</servlet-mapping>

這樣cookie的信息就可以保存一天了。
思考:一個網站的cookie是否存在上限?

  • 一個Cookie只能保存一個信息
  • 一個Web站點可以給瀏覽器發送多個cookie, 最多存放20個cookie(關於這個web站點的,其他站點分開累積)
  • Cookie信息大小限制爲4kb
  • 300個 cookie爲瀏覽器的上限

刪除Cookie

  • 不設置有效期,關閉瀏覽器,自動失效
  • 設置有效時間爲0

2. Session

在這裏插入圖片描述
什麼是Session?

  • 服務器會給每一個用戶(瀏覽器)創建一個Session對象
  • 一個Session獨佔一個瀏覽器,只要瀏覽器沒關閉,這個Session就存在。
  • 用戶登錄之後,整個網站它都可以訪問 —>應用場景: 保存用戶的信息,保存購物車的信息

使用場景:

  • 保存一個登錄用戶的信息
  • 購物車信息
  • 在整個網站中經常使用的數據,我們將他保存在Session中

Session 和Cookie的區別:

  • Cookie是把用戶的數據寫給用戶瀏覽器,瀏覽器保存 (可以保存多個)
  • Session把用戶的數據寫到用戶獨佔Session中,服務器保存 (保存重要信息,減少服務器資源的浪費)
  • Session對象由服務器創建

Session的使用:(本質上也是同一個Servlet)

package com.gs.servlet;

import com.gs.pojo.Person;

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

/**
 * @Auther: Gs
 * @Date: 2020/5/16
 * @Description: com.gs.servlet
 * @version: 1.0
 */
public class SessionDemo01 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("name",new Person("張三",18));
        //獲取session的ID
        String sessionId = session.getId();

        //判斷session是不是新創建的
        if(session.isNew()){
            resp.getWriter().write("session創建成功,Id:"+sessionId);
        }else {
            resp.getWriter().write("session已經在服務中存在了,ID:"+sessionId);
        }

        //session創建的時候做了什麼事情
        //Cookie cookie = new Cookie("JSESSIONID", sessionId);
        //resp.addCookie(cookie);

    }

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

其他的使用說明:
session可以存放對象,可以手動註銷,也可以移除某個key
(其中Person是一個實體對象)

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

session.removeAttribute("name");
//手動註銷session
session.invalidate();

上面的Session類寫完記得在web.xml中註冊

<servlet>
    <servlet-name>SessionDemo01</servlet-name>
    <servlet-class>com.gs.servlet.SessionDemo01</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>SessionDemo01</servlet-name>
    <url-pattern>/s1</url-pattern>
</servlet-mapping>

我們不僅能在 Servlet類對Session的值進行設置,還可以在web.xml中進行設置
比如:設置會話自動過期

<!--設置session默認的失效時間-->
<session-config>
    <!--1分鐘後session自動失效,以分鐘爲單位-->
    <session-timeout>1</session-timeout>
</session-config>

小結:

以上就是Sesion和Cookie的全部內容,其實這兩者的本質都是鍵值對,只不過Cookie是客戶端的行爲,Session是服務器的行爲。而且Cookie的value值只能是字符串,而Session則是Object,所以Session在我們日常開發中使用較爲廣泛。
下面是關於我們瀏覽器中保存的Cookie值,(我們每個人通過審查元素都能看到瀏覽器對於我們會話的保存)
在這裏插入圖片描述

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