JavaEE 要懂的小事:二、圖解 Cookie(小甜餅)
一、概述
首先從HTTP說起,Cookie是Http協議中那部分呢?
Cookie是什麼?
自問自答:Cookie是請求頭域和響應頭域的字段。簡單地說,就是伴隨請求和響應的一組鍵值對的文本,小文本。所以稱之為”Cookie“餅幹。Cookie的生命來源於服務器。首先是客戶端請求服務端,此時請求為第一次,無Cookie參數。這時候,服務端setCookie發送給客戶端。記住,Cookie來源自服務端。
Cookie有什麼用呢?
又自問自答:Cookie來源自服務端,當然服務於客戶。就像你我的會話,文字是在我們之間傳遞的。所以Cookie用於服務端和客戶端的會話。因為Http協議是無狀態的,Cookie就是維持會話,說白了就是傳遞數據的額外媒介。
下麵我們訪問百度地址。
① 產生於服務端的Response,在響應頭域:
② 請求頭域是這樣的:(可以在Cookie Tab頁發現,和響應有一樣的)
下麵泥瓦匠詳細介紹其Cookie在 請求和響應 的傳輸過程。
二、詳細介紹Cookie 傳輸過程
直接上圖,一一詳細解釋。順便寫個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()); // 創建Cookie Cookie cookie = new Cookie("CookieName", "CookieValue"); cookie.setMaxAge(10); cookie.setHttpOnly(true); resp.addCookie(cookie); // 響應 PrintWriter pw = resp.getWriter(); pw.print("<html><body><h1>Hello,Cookie!</h1></body></html>"); } }
① 客戶端訪問,無服務端寫入的Cookie。
代碼 new Cookie(“CookieName”, “CookieValue”); 可以看出服務端產生一個新的鍵值對Cookie,並且設置,說明第一次請求時,請求的請求頭域Cookie是沒有的。下麵沒有CookieName=CookieValue 的Cookie值。如圖:
② 服務端的Cookie傳至瀏覽器。
代碼中 HttpServletResponse.addCookie(cookie); 這樣響應就加入了剛剛那個鍵值對Cookie。怎麼傳到瀏覽器(客戶端)呢? 同樣F12下,
從圖中可得到,Cookie是通過HTTP的響應頭域發送至瀏覽器。每個Cookie的set,都有一個對應Set-Cookie的頭。還有其中的時間代表Cookie的存活時間,HttpOnly可是此Cookie隻讀模式。
③ 瀏覽器解析Cookie,保存至瀏覽器文件。
直接可以打開IE的Internet選項:
如圖,那個位置文件就是我們Cookie存的地方。既然在哪裏,泥瓦匠就去找到它。
打開看看,其內容就是:存放著Cookie信息和URL信息及一些關於時間的。
CookieName CookieValue localhost/servletBYSocket/ 9728 3416923392 30449698 3325104969 30449698 *
這樣就完全搞懂了Cookie如何寫入瀏覽器。
④ 客戶端訪問,有服務端寫入的Cookie。
這樣,同樣的URL再次訪問時,F12下:
不多解釋,看圖。
⑤ 服務器獲取
服務端這時呢?隻要簡單的 getCookies() 就可以獲取Cookie列表了。如圖,服務端控製台打印如下:
泥瓦匠記憶小抄:Cookie傳輸小結
① 客戶端訪問,無服務端寫入的Cookie
② 服務端的Cookie寫入瀏覽器
③ 瀏覽器解析Cookie,保存至瀏覽器文件
④ 客戶端訪問,有服務端寫入的Cookie
⑤ 服務器獲取
四、談Cookie的作用到XSS(跨站點腳本攻擊)
Cookie沒有病毒那麼危險,但包含敏感信息。比如最常見的記住密碼,或者一些用戶經常瀏覽的網頁數據。如圖:
用戶不希望這些泄露,甚至被攻擊。但事實上存在這個攻擊,究竟怎麼攻擊呢?我在 跨腳本攻擊XSS 一文中也詳細介紹並提出解決方案。
全名:Cross Site Script,中文名:跨站腳本攻擊。顧名思義,是指“HTML注入”纂改了網頁,插入惡意的腳本,從而在用戶用瀏覽網頁的時候,控製用戶瀏覽器的一種攻擊。一般攻擊的套路如圖所示:
五、總結
回顧全文,Cookie是HTTP協議中的一種會話機製。也明白下麵兩個問題就好了
1、What 什麼是Cookie
2、How Cookie怎麼用,幹嘛用
最後更新:2017-05-22 16:02:06