1. 程式人生 > 實用技巧 >Java web Cookie詳解(持久化+原理詳解+共享問題+設定中文+傳送多個Cookie)

Java web Cookie詳解(持久化+原理詳解+共享問題+設定中文+傳送多個Cookie)

查詢有道詞典得:

web和餅乾有啥關係?

這個謎底等等來為大家揭曉

會話技術

web中的會話技術類似於生活中兩個人聊天,不過web中的會話指的是伺服器與客戶端的互動

一次會話中包含多次的請求與響應,當瀏覽器給伺服器傳送請求時會話建立,直到一方斷開時會話結束。 功能:在一次會話的範圍內的多次請求之間,可以共享資料 這句話是什麼意思呢,我用購物車來解釋

1.在瀏覽器中,經常涉及到資料交換,如:你登入一個頁面。我們經常會設定自動登入選項。那麼它們就是通過cookie來記住我們的資訊的, cookie是由HTTP伺服器社長子的,儲存在瀏覽器中,但HTTP協議是一種無狀態協議,在資料交換完畢後,服務端和客戶端的連結就會關閉,每次交換資料都需要建立新的連結。就像我們去超市買東西,沒有積分卡的情況下,我們買完東西之後,超市沒有我們任何的消費資訊,但我們辦了積分卡之後,超市就有了我們的消費資訊。cookie就像是積分卡,可以儲存積分,商品就是我們的資訊,超市的系統就像伺服器後臺,HTTP協議就是交易的過程。

2.現在上許多網站都用新使用者註冊這一項,有時註冊一下,等到下次在訪問該站點時,會自動識別到你,並貼向你問好,是不是覺得很親切?當然這種作用知識表面現象,更重要的是,網站可以利用Cookie跟蹤統計使用者訪問該網站的習慣,比如什麼時間訪問,訪問了哪些頁面,在每個網頁的停留時間等。利用這些資訊,一方面是可以為使用者提供個性化服務,另一方面,也可以作為了解所有使用者行為的工具,對於網站經營策略的改進有一定參考價值。例如,你在某家航空公司站點查閱航班時刻表,該站點可能就建立了包含你旅行計劃的Cookies,也可能它只記錄了你在該站點上曾經訪問過的Web頁,在你下次訪問時,網站根據你的情況對顯示的內容進行調整,將你所感興趣的內容放在前列。這是高階的COokie應用。

是一種客戶端會話技術將資料儲存到客戶端

cookie的利弊: 1.將資料儲存到客戶端,十分方便,同時減輕伺服器儲存壓力 2.對儲存資料的個數(20)及大小有限制(4kb)

作用 cookie用來儲存少量及不太敏感的資料 可以在不登入的情況下,對客戶端完成身份識別(即在客戶端設定一個set-cookie的鍵值對,在訪問的時候使用鍵值對來獲取客戶端的身份)

我從以下三個步驟來介紹cookie的使用 1.建立cookie物件 2.傳送cookie物件 3.獲取cookie物件 由Servlet1設定cookie,Servlet2獲取cookie

Servlet1

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("/demo1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //建立cookie
        Cookie cookie = new Cookie("name", "zhangsan");
        resp.addCookie(cookie);
    }

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

Servlet2

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("/demo2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取cookie
     Cookie[] cookies = req.getCookies();
     if (cookies!=null){
         for (Cookie cookie : cookies) {
             //獲取cookie值與名稱
             String value = cookie.getValue();
             String name = cookie.getName();
             System.out.println(name+":"+value);
         }
     }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

響應cookie

請求cookie,另外兩個cookie我們這裡不做介紹

圖解

1.如何實現傳送多個Cookie 2.Cookie可以在瀏覽器中儲存多長時間 3.Cookie如何儲存中文 4.Cookie共享問題

使用response物件呼叫addCookie方法傳送cookie即可

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("/demo1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //建立cookie
        //建立第一個cookie
        Cookie cookie = new Cookie("name", "zhangsan");
        //傳送第一個cookie
        resp.addCookie(cookie);
        //建立第二個cookie
        Cookie id = new Cookie("id", "1");
       //傳送第二個cookie
        resp.addCookie(id);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}
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("/demo2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取cookie
     Cookie[] cookies = req.getCookies();
     //遍歷cookie陣列
     if (cookies!=null){
         for (Cookie cookie : cookies) {
             //獲取cookie值與名稱
             String value = cookie.getValue();
             String name = cookie.getName();
             System.out.println(name+":"+value);
         }
     }
    }

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

客戶端顯示 IDEA列印

2.Cookie可以在瀏覽器中儲存多長時間

預設情況下瀏覽器關閉後,Cookie資料被銷燬 我們可以呼叫setmaxage(int seconds)方法來設定Cookie的儲存時間 1.second為正數,將Cookie持久化寫入硬碟,並且指定儲存的時間,時間到了cookie自動失效 2.second為零,刪除cookie 3.second小於零,預設值,即瀏覽器關閉後刪除cookie

  • 在tomcat 8 之前 cookie中不能直接儲存中文資料。 需要將中文資料轉碼---一般採用URL編碼(%E3)
  • 在tomcat 8 之後,cookie支援中文資料。 特殊字元還是不支援,建議使用URL編碼儲存,URL解碼解析

比如我使用以下程式碼往Cookie中加入資料傳送cookie瀏覽器就會報錯,因為往cookie中加入了空格

Cookie cookie = new Cookie("name", "張  三");
    //傳送第一個cookie
    resp.addCookie(cookie);

所以我需要使用url編碼來控制資料

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;
import java.net.URLDecoder;
import java.net.URLEncoder;

@WebServlet("/demo1")
public class Servlet1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設定響應的訊息體的資料格式以及編碼
       resp.setContentType("text/html;charset=utf-8");
        //建立cookie
        //建立第一個cookie
        String name="張  三";
        //URL編碼
        name= URLEncoder.encode(name,"utf-8");
        Cookie cookie = new Cookie("name", name);
        resp.addCookie(cookie);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}
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;
import java.net.URLDecoder;

@WebServlet("/demo2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取cookie
     Cookie[] cookies = req.getCookies();
     //遍歷cookie陣列
     if (cookies!=null){
         for (Cookie cookie : cookies) {
             //獲取cookie值與名稱
             String value = cookie.getValue();
             String name = cookie.getName();
             //解碼前
             System.out.println(name+":"+value);
             //解碼後
             System.out.println(name+":"+ URLDecoder.decode(value,"utf-8"));
         }
     }
    }

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

結果:

不再報錯

1.假設在一個Tomcat伺服器中部署了多個web專案,如何實現cookie在這些專案中的共享 預設情況下是不可以共享的 但是我們可以呼叫setpath()方法來設定cookie的獲取範圍預設情況下,設定當前的虛擬目錄 * 如果要共享,則可以將path設定為"/"

 //設定響應的訊息體的資料格式以及編碼
       resp.setContentType("text/html;charset=utf-8");
        //建立cookie
        //建立第一個cookie
        String name="張   三";
        //URL編碼
        name= URLEncoder.encode(name,"utf-8");
        Cookie cookie = new Cookie("name", name);
        //設定path讓當前伺服器下部署的所有專案共享cookie的資訊
        //設定為”/“即可共享
        cookie.setPath("/");
        resp.addCookie(cookie);
  1. 不同的tomcat伺服器間cookie共享問題? * setDomain(String path):如果設定一級域名相同,那麼多個伺服器之間cookie可以共享 * setDomain(".baidu.com"),那麼tieba.baidu.com和news.baidu.com中cookie可以共享
   //設定響應的訊息體的資料格式以及編碼
       resp.setContentType("text/html;charset=utf-8");
        //建立cookie
        //建立第一個cookie
        String name="張   三";
        //URL編碼
        name= URLEncoder.encode(name,"utf-8");
        Cookie cookie = new Cookie("name", name);
        //設定path讓不同的伺服器之間可以共享cookie的資訊
        //比如設定域名為".baidu.com"的可以共享cookie
       cookie.setDomain(".baidu.com");
        resp.addCookie(cookie);

如有錯誤還請各位批評指正,寫文不易,喜歡的還請點個贊,如有疑問評論留言,我會經常更新文章,看了文章覺得有幫助的可以關注我呀