最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaEE Cookie的基本使用細(xì)節(jié)

 更新時間:2022年12月08日 09:41:12   作者:-BoBooY-  
本章我們將學(xué)習(xí)會話跟蹤技術(shù)中的Cookie與Session,它在我們整個JavaEE的知識體系中是非常重要的,本節(jié)我們先介紹Cookie,廢話不多說,直接上正文

1、會話跟蹤技術(shù)

1.1、概述

會話:用戶打開瀏覽器,訪問web服務(wù)器的資源,會話建立,直到有一方斷開連接,會話結(jié)束。在一次會話中可以包含多次請求和響應(yīng)。

從瀏覽器發(fā)出請求到服務(wù)端響應(yīng)數(shù)據(jù)給前端之后,一次會話(在瀏覽器和服務(wù)器之間)就被建立了

會話被建立后,如果瀏覽器或服務(wù)端都沒有被關(guān)閉,則會話就會持續(xù)建立著

瀏覽器和服務(wù)器就可以繼續(xù)使用該會話進(jìn)行請求發(fā)送和響應(yīng),上述的整個過程就被稱之為會話。

會話跟蹤:一種維護瀏覽器狀態(tài)的方法,服務(wù)器需要識別多次請求是否來自于同一瀏覽器,以便在同一次會話的多次請求間共享數(shù)據(jù)。

服務(wù)器會收到多個請求,這多個請求可能來自多個瀏覽器,如上圖中的6個請求來自3個瀏覽器

服務(wù)器需要用來識別請求是否來自同一個瀏覽器

服務(wù)器用來識別瀏覽器的過程,這個過程就是會話跟蹤

服務(wù)器識別瀏覽器后就可以在同一個會話中多次請求之間來共享數(shù)據(jù)

問:為什么一個會話中的多次請求要共享數(shù)據(jù)?有了這個數(shù)據(jù)共享功能后能實現(xiàn)哪些功能?

答:

  • 購物車,在選完商品加入購物車后,當(dāng)點擊去結(jié)算時顯示之前加入購物車的商品信息時就需要用到共享數(shù)據(jù);
  • 登錄,登錄后展示個人信息;
  • 登錄頁面 ” 記住我 “,在第一次登陸成功后,下次登錄會自動填充賬號和密碼
  • 登錄頁面的驗證碼功能,生成驗證碼和輸入驗證碼點擊注冊這也是兩次請求,這兩次請求的數(shù)據(jù)之間要進(jìn)行對比

問:為什么現(xiàn)在瀏覽器和服務(wù)器不支持?jǐn)?shù)據(jù)共享呢

答:

  • 瀏覽器和服務(wù)器之間使用的是HTTP請求來進(jìn)行數(shù)據(jù)傳輸
  • HTTP協(xié)議是無狀態(tài)的,每次瀏覽器向服務(wù)器請求時,服務(wù)器都會將該請求視為新的請求
  • HTTP協(xié)議設(shè)計成無狀態(tài)的目的是讓每次請求之間相互獨立,互不影響
  • 請求與請求之間獨立后,就無法實現(xiàn)多次請求之間的數(shù)據(jù)共享

1.2、實現(xiàn)方式

會話跟蹤技術(shù)的實現(xiàn)方式有:Cookie(客戶端會話跟蹤技術(shù))、Session(服務(wù)端會話跟蹤技術(shù))

兩者之間的區(qū)別:Cookie是存儲在瀏覽器端而Session是存儲在服務(wù)器端

2、Cookie

2.1、Cookie的基本使用

2.1.1、概念

Cookie:客戶端會話技術(shù),將數(shù)據(jù)保存到客戶端,以后每次請求都攜帶Cookie數(shù)據(jù)進(jìn)行訪問。

2.1.2、Cookie的工作流程

  • 服務(wù)端提供了兩個Servlet,分別是ServletA和ServletB
  • 瀏覽器發(fā)送HTTP請求1給服務(wù)端,服務(wù)端ServletA接收請求并進(jìn)行業(yè)務(wù)處理
  • 服務(wù)端ServletA在處理的過程中可以創(chuàng)建一個Cookie對象并將name=zs的數(shù)據(jù)存入Cookie
  • 服務(wù)端ServletA在響應(yīng)數(shù)據(jù)的時候,會把Cookie對象響應(yīng)給瀏覽器
  • 瀏覽器接收到響應(yīng)數(shù)據(jù),會把Cookie對象中的數(shù)據(jù)存儲在瀏覽器內(nèi)存中,此時瀏覽器和服務(wù)端就建立了一次會話
  • 在同一次會話中瀏覽器再次發(fā)送HTTP請求2給服務(wù)端ServletB,瀏覽器會攜帶Cookie對象中的所有數(shù)據(jù)
  • ServletB接收到請求和數(shù)據(jù)后,就可以獲取到存儲在Cookie對象中的數(shù)據(jù),這樣同一個會話中的多次請求之間就實現(xiàn)了數(shù)據(jù)共享

2.1.3、Cookie的基本使用

對于Cookie的使用,我們更關(guān)注的應(yīng)該是后臺代碼如何操作Cookie,對于Cookie的操作主要分兩大類,本別是發(fā)送Cookie和獲取Cookie,對于上面這兩塊內(nèi)容,分別該如何實現(xiàn)呢?

1)發(fā)送Cookie

創(chuàng)建Cookie對象,并設(shè)置數(shù)據(jù)

Cookie cookie = new Cookie("key","value");

發(fā)送Cookie到客戶端:使用response對象

response.addCookie(cookie);

《Cookie發(fā)送案例》 創(chuàng)建Maven項目cookie-demo,并在pom.xml添加依賴

<!--servlet-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<!--jsp-->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>
<!--jstl-->
<dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

編寫Servlet類,名稱為AServlet,并在Servlet中創(chuàng)建Cookie對象,存入數(shù)據(jù),發(fā)送給前端

package com.bby;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //發(fā)送Cookie
        //1.創(chuàng)建Cookie對象
        Cookie cookie = new Cookie("username", "bby");
        //2.發(fā)送Cookie,response
        response.addCookie(cookie);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request,response);
    }
}

配置Tomcat

啟動項目測試,瀏覽器查看Cookie的值

訪問http://localhost:8080/aServlet

方式一:瀏覽器設(shè)置中查看,此處使用 Edge瀏覽器查看(新版火狐和谷歌瀏覽器都不能查看具體信息)

方式二:瀏覽器(此處以谷歌瀏覽器為例)中按下 F12

2)獲取Cookie

獲取客戶端攜帶的所有Cookie,使用request對象

Cookie[] cookies = request.getCookies();

遍歷數(shù)組,獲取每一個Cookie對象

使用Cookie對象方法獲取數(shù)據(jù)

for(Cookie cookie : cookies) {
    cookie.getName();
    cookie.getValue();
}

《Cookie獲取案例》 編寫一個新Servlet類,名稱為BServlet

package com.bby;
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;
@WebServlet("/bServlet")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取Cookie
        //1. 獲取Cookie數(shù)組
        Cookie[] cookies = req.getCookies();
        //2. 遍歷數(shù)組
        for (Cookie cookie : cookies) {
            //3. 獲取數(shù)據(jù)
            String name = cookie.getName();
            if (name.equals("username")) {
                String value = cookie.getValue();
                System.out.println(name + ":" + value);
            }
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

啟動項目測試

2.2、Cookie的原理分析

對于Cookie的實現(xiàn)原理是基于HTTP協(xié)議的,其中設(shè)計到HTTP協(xié)議中的兩個請求頭信息:

  • 響應(yīng)頭:set-cookie
  • 請求頭:cookie

  • 前面的案例中已經(jīng)能夠?qū)崿F(xiàn),AServlet給前端發(fā)送Cookie,BServlet從request中獲取Cookie的功能
  • 對于AServlet響應(yīng)數(shù)據(jù)的時候,Tomcat服務(wù)器都是基于HTTP協(xié)議來響應(yīng)數(shù)據(jù)
  • 當(dāng)Tomcat發(fā)現(xiàn)后端要返回的是一個Cookie對象之后,Tomcat就會在響應(yīng)頭中添加一行數(shù)據(jù)Set-Cookie:username=zs
  • 瀏覽器獲取到響應(yīng)結(jié)果后,從響應(yīng)頭中就可以獲取到Set-Cookie對應(yīng)值username=zs,并將數(shù)據(jù)存儲在瀏覽器的內(nèi)存中
  • 瀏覽器再次發(fā)送請求給BServlet的時候,瀏覽器會自動在請求頭中添加Cookie: username=zs發(fā)送給服務(wù)端BServlet
  • Request對象會把請求頭中cookie對應(yīng)的值封裝成一個個Cookie對象,最終形成一個數(shù)組
  • BServlet通過Request對象獲取到Cookie[]后,就可以從中獲取自己需要的數(shù)據(jù)

《驗證上述結(jié)論》

訪問http://localhost:8080/bServlet

從響應(yīng)頭獲取到Set-Cookie對應(yīng)值username=bby

訪問http://localhost:8080/bServlet

向請求頭中添加Cookie: username=bby

2.3、Cookie的使用細(xì)節(jié)

在使用Cookie時我們要注意兩點:第一個是Cookie的存活時間,第二個是Cookie如何存儲中文

2.3.1、Cookie的存活時間

思考:當(dāng)我們關(guān)閉瀏覽器后再重新打開,AServlet響應(yīng)存有的username=bby的Cookie對象給瀏覽器還存在嗎?

結(jié)論:不存在,當(dāng)我們關(guān)閉瀏覽器后再通過BServlet訪問這個Cookie對象時就獲取不到了

原因:默認(rèn)情況下,Cookie存儲在瀏覽器內(nèi)存中,當(dāng)瀏覽器關(guān)閉,內(nèi)存釋放,則Cookie被銷毀

《實際案例分析》 分析

當(dāng)我們登錄的時候在賬號和密碼下方有一個“記住我”的按鈕,這個功能就相當(dāng)于第一次輸入用戶名和密碼并勾選后進(jìn)行登錄,下次再登陸的時候,用戶名和密碼就會被自動填充,不需要再重新輸入登錄。但是我們要是使用默認(rèn)的Cookie,瀏覽器一關(guān),Cookie就會從瀏覽器內(nèi)存中被刪除,這個功能就無法實現(xiàn)了

如何將Cookie持久化存儲?

Cookie其實已經(jīng)為我們提供好了對應(yīng)的API來完成這件事,這個API就是setMaxAge

設(shè)置Cookie存活時間

setMaxAge(int seconds)

參數(shù)值為:

1.正數(shù):將Cookie寫入瀏覽器所在電腦的硬盤,持久化存儲。到時間自動刪除

2.負(fù)數(shù):默認(rèn)值,Cookie在當(dāng)前瀏覽器內(nèi)存中,當(dāng)瀏覽器關(guān)閉,則Cookie被銷毀

3.零:刪除對應(yīng)Cookie

《案例:設(shè)置Cookie存活時間》 編寫Servlet

package com.bby;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //發(fā)送Cookie
        //1.創(chuàng)建Cookie對象
        Cookie cookie = new Cookie("username", "bby");
        cookie.setMaxAge(7*24*60*60); //7天,這樣寫便于閱讀
        //cookie.setMaxAge(604800); //不易閱讀(可以使用注解彌補),程序少進(jìn)行一次計算
        //2.發(fā)送Cookie,response
        response.addCookie(cookie);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }
}

運行項目測試

先訪問一次http://localhost:8080/aServlet,然后關(guān)閉瀏覽器并重啟,訪問http://localhost:8080/bServlet,能在控制臺打印出username:bby,說明Cookie沒有隨著瀏覽器關(guān)閉而被銷毀

可以看到Cookie的創(chuàng)建時間與到期時間相差一周,如下圖

2.3.2、Cookie存儲中文

Cookie直接存儲中文會發(fā)生什么?

修改代碼

運行測試

結(jié)論:Cookie不能直接存儲中文

解決方式:先對中文進(jìn)行URL編碼,采用URLEncoder.encode(),將編碼后的值存入Cookie中,再將獲取到的值進(jìn)行解碼

編碼

String value = "啵啵魚";
//對中文進(jìn)行URL編碼
value = URLEncoder.encode(value, "UTF-8");
//將編碼后的值存入Cookie中
Cookie cookie = new Cookie("username",value);

解碼

//將獲取的Cookie值進(jìn)行解碼
//URL解碼
value = URLDecoder.decode(value,"UTF-8");

這樣,我們就可以將中文存入Cookie中進(jìn)行使用。

下節(jié)我們講解Session

到此這篇關(guān)于JavaEE Cookie的基本使用細(xì)節(jié)的文章就介紹到這了,更多相關(guān)Java Cookie內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WIN10環(huán)境 Maven的安裝與配置詳細(xì)教程

    WIN10環(huán)境 Maven的安裝與配置詳細(xì)教程

    這篇文章主要介紹了WIN10環(huán)境 Maven的安裝與配置詳細(xì)教程,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • java編程實現(xiàn)優(yōu)先隊列的二叉堆代碼分享

    java編程實現(xiàn)優(yōu)先隊列的二叉堆代碼分享

    這篇文章主要介紹了java編程實現(xiàn)優(yōu)先隊列的二叉堆代碼分享,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java定時任務(wù)原理詳解

    Java定時任務(wù)原理詳解

    當(dāng)下,java編碼過程中,實現(xiàn)定時任務(wù)的方式主要以以下兩種為主:spring框架的@Scheduled和quzrtz框架。本文主要就二者的框架原理實現(xiàn)做一個入門引導(dǎo),為了解深層實現(xiàn)細(xì)節(jié)做一定的鋪墊
    2022-07-07
  • 關(guān)于idea中出現(xiàn)nbsp和zwsp的完美解決辦法

    關(guān)于idea中出現(xiàn)nbsp和zwsp的完美解決辦法

    本文給大家介紹關(guān)于idea中出現(xiàn)nbsp和zwsp的解決辦法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-06-06
  • 解決kafka:org.apache.kafka.common.errors.TimeoutException問題

    解決kafka:org.apache.kafka.common.errors.TimeoutException問題

    這篇文章主要介紹了解決kafka:org.apache.kafka.common.errors.TimeoutException問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java日常練習(xí)題,每天進(jìn)步一點點(7)

    Java日常練習(xí)題,每天進(jìn)步一點點(7)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • java多線程-讀寫鎖原理

    java多線程-讀寫鎖原理

    本文主要介紹java多線程的知識,這里整理了相關(guān)資料及簡單示例代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • Java設(shè)計模式之裝飾模式詳解

    Java設(shè)計模式之裝飾模式詳解

    這篇文章主要介紹了Java設(shè)計模式中的裝飾者模式,裝飾者模式即Decorator?Pattern,裝飾模式是在不必改變原類文件和使用繼承的情況下,動態(tài)地擴展一個對象的功能,裝飾模式又名包裝模式。裝飾器模式以對客戶端透明的方式拓展對象的功能,是繼承關(guān)系的一種替代方案
    2022-07-07
  • 圖解Java排序算法之快速排序的三數(shù)取中法

    圖解Java排序算法之快速排序的三數(shù)取中法

    這篇文章主要為大家詳細(xì)介紹了Java排序算法之快速排序的三數(shù)取中法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 一文教會你使用Java中的枚舉Enmu

    一文教會你使用Java中的枚舉Enmu

    枚舉是 Java 中的一種特殊類型,它用于表示一組固定值,這篇文章就是來和大家講講枚舉的作用與具體使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06

最新評論

谢通门县| 屯留县| 行唐县| 叶城县| 临洮县| 枣阳市| 西安市| 葫芦岛市| 兴仁县| 靖江市| 乌鲁木齐市| 丰宁| 崇礼县| 山丹县| 启东市| 天镇县| 四会市| 阿克苏市| 新民市| 彩票| 榆树市| 房产| 白水县| 洛隆县| 印江| 宣武区| 隆尧县| 贺兰县| 水富县| 鄢陵县| 天祝| 泌阳县| 米林县| 宣城市| 汉阴县| 加查县| 邮箱| 余姚市| 博白县| 长武县| 弥渡县|