Java面試HTTP篇之二:Cookie
瀏覽器Cookie太大,導(dǎo)致請(qǐng)求時(shí),請(qǐng)求頭域過大造成發(fā)送失敗。下面咱們就了解了解Cookie。按著以前的思路圖文并茂哈,沒圖說個(gè)XX。
一、概述
首先從HTTP說起,Cookie是Http協(xié)議中那部分呢?
Cookie是什么?
自問自答:Cookie是請(qǐng)求頭域和響應(yīng)頭域的字段。簡(jiǎn)單地說,就是伴隨請(qǐng)求和響應(yīng)的一組鍵值對(duì)的文本,小文本。所以稱之為”Cookie“餅干。Cookie的生命來源于服務(wù)器。首先是客戶端請(qǐng)求服務(wù)端,此時(shí)請(qǐng)求為第一次,無Cookie參數(shù)。這時(shí)候,服務(wù)端setCookie發(fā)送給客戶端。記住,Cookie來源自服務(wù)端。
Cookie有什么用呢?
又自問自答:Cookie來源自服務(wù)端,當(dāng)然服務(wù)于客戶。就像你我的會(huì)話,文字是在我們之間傳遞的。所以Cookie用于服務(wù)端和客戶端的會(huì)話。因?yàn)镠ttp協(xié)議是無狀態(tài)的,Cookie就是維持會(huì)話,說白了就是傳遞數(shù)據(jù)的額外媒介。
下面我們?cè)L問百度地址。
① 產(chǎn)生于服務(wù)端的Response,在響應(yīng)頭域:
② 請(qǐng)求頭域是這樣的:(可以在Cookie Tab頁(yè)發(fā)現(xiàn),和響應(yīng)有一樣的)
下面泥瓦匠詳細(xì)介紹其Cookie在 請(qǐng)求和響應(yīng) 的傳輸過程。
二、詳細(xì)介紹Cookie 傳輸過程
直接上圖,一一詳細(xì)解釋。順便寫個(gè)CookieServlet,模擬一下Cookie的一生。代碼如下:
- package org.bysocket.http;
 - import java.io.IOException;
 - import java.io.PrintWriter;
 - 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;
 - @WebServlet(urlPatterns="/cookie")
 - public class CookieServletT extends HttpServlet
 - {
 - private static final long serialVersionUID = 1L;
 - @Override
 - protected void doGet(HttpServletRequest req, HttpServletResponse resp)
 - throws ServletException, IOException
 - {
 - // 獲取Cookie
 - Cookie[] cookies = req.getCookies();
 - for (Cookie cookie : cookies)
 - System.out.println(cookie.getName() + " " + cookie.getValue());
 - // 創(chuàng)建Cookie
 - Cookie cookie = new Cookie("CookieName", "CookieValue");
 - cookie.setMaxAge(10);
 - cookie.setHttpOnly(true);
 - resp.addCookie(cookie);
 - // 響應(yīng)
 - PrintWriter pw = resp.getWriter();
 - pw.print("<html><body><h1>Hello,Cookie!</h1></body></html>");
 - }
 - }
 
① 客戶端訪問,無服務(wù)端寫入的Cookie。
代碼 new Cookie("CookieName", "CookieValue"); 可以看出服務(wù)端產(chǎn)生一個(gè)新的鍵值對(duì)Cookie,并且設(shè)置,說明第一次請(qǐng)求時(shí),請(qǐng)求的請(qǐng)求頭域Cookie是沒有的。下面沒有CookieName=CookieValue 的Cookie值。如圖:
② 服務(wù)端的Cookie傳至瀏覽器。
代碼中 HttpServletResponse.addCookie(cookie); 這樣響應(yīng)就加入了剛剛那個(gè)鍵值對(duì)Cookie。怎么傳到瀏覽器(客戶端)呢? 同樣F12下,
從圖中可得到,Cookie是通過HTTP的響應(yīng)頭域發(fā)送至瀏覽器。每個(gè)Cookie的set,都有一個(gè)對(duì)應(yīng)Set-Cookie的頭。還有其中的時(shí)間代表Cookie的存活時(shí)間,HttpOnly可是此Cookie只讀模式。
③ 瀏覽器解析Cookie,保存至瀏覽器文件。
直接可以打開IE的Internet選項(xiàng):
如圖,那個(gè)位置文件就是我們Cookie存的地方。既然在哪里,泥瓦匠就去找到它。
打開看看,其內(nèi)容就是:存放著Cookie信息和URL信息及一些關(guān)于時(shí)間的。
- CookieName
 - CookieValue
 - localhost/servletBYSocket/
 - 9728
 - 3416923392
 - 30449698
 - 3325104969
 - 30449698
 - *
 
這樣就完全搞懂了Cookie如何寫入瀏覽器。
④ 客戶端訪問,有服務(wù)端寫入的Cookie。
這樣,同樣的URL再次訪問時(shí),F(xiàn)12下:
不多解釋,看圖。
⑤ 服務(wù)器獲取
服務(wù)端這時(shí)呢?只要簡(jiǎn)單的 getCookies() 就可以獲取Cookie列表了。如圖,服務(wù)端控制臺(tái)打印如下:
三、泥瓦匠記憶小抄:Cookie傳輸小結(jié)
① 客戶端訪問,無服務(wù)端寫入的Cookie
② 服務(wù)端的Cookie寫入瀏覽器
③ 瀏覽器解析Cookie,保存至瀏覽器文件
④ 客戶端訪問,有服務(wù)端寫入的Cookie
⑤ 服務(wù)器獲取
四、談Cookie的作用到XSS(跨站點(diǎn)腳本攻擊)
Cookie沒有病毒那么危險(xiǎn),但包含敏感信息。比如最常見的記住密碼,或者一些用戶經(jīng)常瀏覽的網(wǎng)頁(yè)數(shù)據(jù)。
用戶不希望這些泄露,甚至被攻擊。但事實(shí)上存在這個(gè)攻擊,究竟怎么攻擊呢?我在 跨腳本攻擊XSS 一文中也詳細(xì)介紹并提出解決方案。
全名:Cross Site Script,中文名:跨站腳本攻擊。顧名思義,是指“HTML注入”纂改了網(wǎng)頁(yè),插入惡意的腳本,從而在用戶用瀏覽網(wǎng)頁(yè)的時(shí)候,控制用戶瀏覽器的一種攻擊。一般攻擊的套路如圖所示:
五、總結(jié)
回顧全文,Cookie是HTTP協(xié)議中的一種會(huì)話機(jī)制。也明白下面兩個(gè)問題就好了
1、What 什么是Cookie
2、How Cookie怎么用,干嘛用
【本文為51CTO專欄作者“李強(qiáng)強(qiáng)”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過51CTO聯(lián)系作者獲取授權(quán)】
























 
 
 



 
 
 
 