JavaWeb 會話技術之Cookie

来源:https://www.cnblogs.com/cjdstudy/archive/2020/05/01/12814900.html
-Advertisement-
Play Games

會話技術 1. 會話:一次會話中包含多次請求和響應 一次會話:瀏覽器第一次給伺服器發送請求,會話建立,直到有一方斷開為止 2. 功能:在一次會話的範圍內的多次請求間,共用數據 3. 方式: 1. 客戶端會話技術:Cookie 2. 伺服器端會話技術:Session Cookie 1. 概念:客戶端會 ...


會話技術

  1. 會話:一次會話中包含多次請求和響應
    • 一次會話:瀏覽器第一次給伺服器發送請求,會話建立,直到有一方斷開為止
  2. 功能:在一次會話的範圍內的多次請求間,共用數據
  3. 方式:
    1. 客戶端會話技術:Cookie
    2. 伺服器端會話技術:Session
  1. 概念:客戶端會話技術,將數據保存到客戶端

  2. 快速入門:

    • 使用步驟:
      1. 創建Cookie對象,綁定數據
        • new Cookie(String name,String value)
      2. 發送Cookie對象
        • response.addCookie(Cookie cookie)
      3. 獲取Cookie,拿到數據
        • Cookie[] request.get
  3. 實現原理

    • 基於響應頭set-cookie 和請求頭cookie實現
  4. Cookie的細節

    1. 一次可不可以發送多個Cookie

      • 可以
      • 可以創建多個Cookie對象,使用response調用多次addCookie方法發送cookie即可
    2. Cookie在瀏覽器保存多長時間

      • 預設情況:當瀏覽器關閉後,Cookie數據被銷毀
      • 持久化存儲
        • setMaxAge(int seconds)
          1. 正數:將Cookie數據寫到硬碟的文件中。持久化存儲。Cookie存活時間
          2. 負數:預設值
          3. 零:刪除Cookie信息
    3. Cookie能不能存中文

      • 在tomcat8之前不支持
      • 在tomcat8之後支持
    4. Cookie獲取範圍多大?

      1. 假設在一個tomcat伺服器中,部署了多個web項目,那麼能在這些web項目中Cookie能不能共用
        • 預設情況下Cookie不能共用
        • setPath(String path):設置cookie的獲取範圍。預設情況下,設置當前的虛擬目錄
          • 如果要共用,則可以將path設置為"/"
      2. 不同的tomcat伺服器Cookie共用問題
        • setDomain(String path):如果設置一級功能變數名稱相同,那麼多個伺服器之間的cookie可以共用
          • setDomain(".baidu.com"),那麼tieba.baidu.com和news.baidu.com中cookies可以共用
    5. Cookie的特點和作用

      • 特點

        1. cookie存儲數據在客戶端瀏覽器
        2. 瀏覽器對於單個cookie的大小有限制(4kb),以及對同一個功能變數名稱下的總cookie數量也有限制(20個)
      • 作用

        1. cookie一般用於存少量的不太敏感的數據
        2. 在不登錄的情況下,完成伺服器對客戶端的身份識別
    6. 案例:記住上一次訪問時間

      1. 需求:

        1. 訪問一個Servlet,如果是第一次訪問,則提示:你好,歡迎你首次訪問
        2. 如果不是第一次訪問,則提示:歡迎回來,您上次訪問的時間為:顯示時間字元串
      2. 分析

        1. 可以採用Cookie來完成
        2. 在伺服器中的Servlet判斷是否有一個名為lastTime的cookie
          1. 有:不是第一次訪問
          2. 沒有:是第一次訪問
            1. 響應數據:您好,歡迎首次訪問
            2. 寫回cookie:lastTime=xxxxx
      3. 代碼

        public class CookieTest extends HttpServlet {
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                //設置響應的消息體的數據格式以及編碼
                resp.setContentType("text/html;charset=utf-8");
                //1.獲取所有cookie
                Cookie[] cookies = req.getCookies();
                boolean flag = false;//沒有cookie為lastTime
                //2.遍歷cookies數組
                if (cookies != null && cookies.length > 0){
                    for (Cookie cookie : cookies) {
                        //3.獲取cookie的名稱
                        String name = cookie.getName();
                        //4.判斷名稱是否是lastTime
                        if ("lastTime".equals(name)){
                            //有該cookie,不是第一次訪問
                            flag = true; //有lastTime的cookie
                            //設置Cookie的value
                            //獲取當前時間的字元串,重新設置cookie的值,重新發送cookie
                            Date date = new Date();
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日 HH:MM:SS");
                            String str_date = sdf.format(date);
                            System.out.println("編碼前"+str_date);
                            //URL編碼
                            str_date = URLEncoder.encode(str_date,"utf-8");
                            System.out.println("編碼後"+str_date);
                            //設置cookie的存活時間
                            cookie.setMaxAge(60*60*24*30);//一個月
                            resp.addCookie(cookie);
                            //響應數據
                            //獲取cookie的value
                            String value = cookie.getValue();
                            System.out.println("解碼前"+value);
                            value = URLDecoder.decode(value,"utf-8");
                            System.out.println("解碼後"+value);
                            resp.getWriter().write("<h1>歡迎回來,寧上次訪問的時間為:"+value+"</h1>");
                            break;
                        }
                    }
                }
        
                if(cookies == null || cookies.length == 0 || flag == false){
                    //沒有cookie,第一次訪問
                    //設置Cookie的value
                    //獲取當前時間的字元串,重新設置cookie的值,重新發送cookie
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日 HH:MM:SS");
                    String str_date = sdf.format(date);
        
                    System.out.println("編碼前"+str_date);
                    //URL編碼
                    str_date = URLEncoder.encode(str_date,"utf-8");
                    System.out.println("編碼後"+str_date);
        
                    Cookie cookie = new Cookie("lastTime",str_date);
                    //設置cookie的存活時間
                    cookie.setMaxAge(60*60*24*30);//一個月
                    resp.addCookie(cookie);
                    resp.getWriter().write("<h1>您好,歡迎你的首次訪問</h1>");
                }
            }
        
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                this.doPost(req,resp);
            }
        }
        
        

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 六大設計原則 單一職責 定義 每個類都應該有一個單一的功能 一個類或者模塊應該有且只有一個改變的原因 規範 定義類的方法 避免類之間耦合度太高 里氏替換 定義 只要有父類出現的地方,都可以用子類來替代 規範 不要破壞繼承體系 增加子類的時候系統可以正常執行 依賴倒置原則 定義 高層模塊不應該依賴底層 ...
  • OO第二階段(5-8周)PTA作業總結 0.前言 本次博客針對的是PTA第二階段的作業,這次作業相比於第一階段來講難度、思維高度都提高了很多,耗費的精力和時間也很多但是收穫很大;這次作業很大一部分難點及側重點是在正則表達式上,這一部分確實難學,你要對程式的需求分析精準,不斷修改正則才能達到預期結果; ...
  • 前言 併發編程是java中不可或缺的模塊。與串列程式相比,它們能使複雜的非同步代碼變得簡單,從而極大地簡化了複雜系統的開發。此外,想要充分發揮多處理器系統的強大計算能力,最簡單的方式就是使用線程。隨著處理器數量的持續增長,如何高效地使用蝙蝠正變得越來越重要。同時在當今互聯網的時代,大量的互聯網應用都面 ...
  • 使用自定義視圖解析器: 配置自定義視圖跳轉: 通過配置擴展 SpringMVC: ...
  • 1. JPA核心API對象 1.1.Persistence持久化對象 Persisitence主要用於創建EntityMangerFactory,它可以根據傳入的持久化單元名稱來創建對應的EntityMangerFactory。 // 對應配置文件裡面的persistence-unit name=" ...
  • Springboot登錄攔截器 和 swagger框架介面自動生成html文檔 使用開發工具:IDEA 實現步驟如下 1.需導入的依賴如下: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifa ...
  • 這個問題比較常見了,一般是在第一次上傳項目到github或者gitee上會出現。 以前將項目上傳到github的時候出現這個問題,百般查找,找到一個好用的解決辦法,依次輸入以下命令: git pull git pull origin master git pull origin master --a ...
  • Sleuth+Zipkin用來實現分散式系統的鏈路追蹤。 Sleuth組件用於日誌埋點、記錄鏈路數據,Zipkin組件用於展示鏈路數據。 Sleuth的使用 (1)創建消費者、提供者時勾選Spring Cloud Tracing -> Sleuth 也可以手動添加依賴: <dependency> < ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...