Java web Cookie詳解
啥是cookie?
查詢有道詞典得:


web和餅干有啥關系?

這個謎底等等來為大家揭曉
會話技術
web中的會話技術類似于生活中兩個人聊天,不過web中的會話指的是服務器與客戶端的互動
一次會話中包含多次的請求與回應,當瀏覽器給服務器發送請求時會話建立,直到一方斷開時會話結束,
功能:在一次會話的范圍內的多次請求之間,可以共享資料
這句話是什么意思呢,我用購物車來解釋

1.在瀏覽器中,經常涉及到資料交換,如:你登錄一個頁面,我們經常會設定自動登錄選項,那么它們就是通過cookie來記住我們的資訊的, cookie是由HTTP服務器社長子的,保存在瀏覽器中,但HTTP協議是一種無狀態協議,在資料交換完畢后,服務端和客戶端的鏈接就會關閉,每次交換資料都需要建立新的鏈接,就像我們去超市買東西,沒有積分卡的情況下,我們買完東西之后,超市沒有我們任何的消費資訊,但我們辦了積分卡之后,超市就有了我們的消費資訊,cookie就像是積分卡,可以保存積分,商品就是我們的資訊,超市的系統就像服務器后臺,HTTP協議就是交易的程序,
2.現在上許多網站都用新用戶注冊這一項,有時注冊一下,等到下次在訪問該站點時,會自動識別到你,并貼向你問好,是不是覺得很親切?當然這種作用知識表面現象,更重要的是,網站可以利用Cookie跟蹤統計用戶訪問該網站的習慣,比如什么時間訪問,訪問了哪些頁面,在每個網頁的停留時間等,利用這些資訊,一方面是可以為用戶提供個性化服務,另一方面,也可以作為了解所有用戶行為的工具,對于網站經營策略的改進有一定參考價值,例如,你在某家航空公司站點查閱航班時刻表,該站點可能就創建了包含你旅行計劃的Cookies,也可能它只記錄了你在該站點上曾經訪問過的Web頁,在你下次訪問時,網站根據你的情況對顯示的內容進行調整,將你所感興趣的內容放在前列,這是高級的COokie應用,

cookie的概念
是一種客戶端會話技術將資料保存到客戶端
cookie的利弊:
1.將資料保存到客戶端,十分方便,同時減輕服務器存盤壓力
2.對保存資料的個數(20)及大小有限制(4kb)
作用
cookie用來保存少量及不太敏感的資料
可以在不登入的情況下,對客戶端完成身份識別(即在客戶端設定一個set-cookie的鍵值對,在訪問的時候使用鍵值對來獲取客戶端的身份)
如何使用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 = https://www.cnblogs.com/pjhaymy/p/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我們這里不做介紹

圖解:

Cookie的相關問題
1.如何實作發送多個Cookie
2.Cookie可以在瀏覽器中保存多長時間
3.Cookie如何保存中文
4.Cookie共享問題
1.如何實作發送多個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 = https://www.cnblogs.com/pjhaymy/p/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
3.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 = https://www.cnblogs.com/pjhaymy/p/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);
}
}
結果:
不再報錯


4.Cookie共享問題
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);
- 不同的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);
如有錯誤還請各位批評指正,寫文不易,喜歡的還請點個贊,如有疑問評論留言,我會經常更新文章,看了文章覺得有幫助的可以關注我呀

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/1020.html
標籤:面向對象
