JavaEE 要懂的小事:2、圖解 Cookie(小甜餅)

這就是由於瀏覽器Cookie太大,致使請求時,請求頭域過大形成發送失敗。下面我們就瞭解瞭解Cookie。按着之前的思路圖文並茂哈,沒圖說個XX。html

1、概述

首先從HTTP提及,Cookie是Http協議中那部分呢?java

Cookie是什麼?瀏覽器

自問自答:Cookie是請求頭域和響應頭域的字段。簡單地說,就是伴隨請求和響應的一組鍵值對的文本,小文本。因此稱之爲」Cookie「餅乾。Cookie的生命來源於服務器。首先是客戶端請求服務端,此時請求爲第一次,無Cookie參數。這時候,服務端setCookie發送給客戶端。記住,Cookie來源自服務端服務器

Cookie有什麼用呢?cookie

又自問自答:Cookie來源自服務端,固然服務於客戶。就像你個人會話,文字是在咱們之間傳遞的。因此Cookie用於服務端和客戶端的會話。由於Http協議是無狀態的,Cookie就是維持會話,說白了就是傳遞數據的額外媒介。socket

下面咱們訪問百度地址。ide

① 產生於服務端Response,在響應頭域url

image

② 請求頭域是這樣的:(能夠在Cookie Tab頁發現,和響應有同樣的)spa

image

下面泥瓦匠詳細介紹其Cookie在 請求和響應 的傳輸過程。code

2、詳細介紹Cookie 傳輸過程

Cookie Work

直接上圖,一一詳細解釋。順便寫個CookieServlet,模擬一下Cookie的一輩子。代碼以下:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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值。如圖:

image

② 服務端的Cookie傳至瀏覽器。

代碼中 HttpServletResponse.addCookie(cookie); 這樣響應就加入了剛剛那個鍵值對Cookie。怎麼傳到瀏覽器(客戶端)呢? 一樣F12下,

image

從圖中可獲得,Cookie是經過HTTP的響應頭域發送至瀏覽器。每一個Cookie的set,都有一個對應Set-Cookie的頭。還有其中的時間表明Cookie的存活時間,HttpOnly但是此Cookie只讀模式。

③ 瀏覽器解析Cookie,保存至瀏覽器文件。

直接能夠打開IE的Internet選項:

image

如圖,那個位置文件就是咱們Cookie存的地方。既然在哪裏,泥瓦匠就去找到它。

image

打開看看,其內容就是:存放着Cookie信息和URL信息及一些關於時間的。

?

1
2
3
4
5
6
7
8
9
CookieName
CookieValue
localhost/servletBYSocket/
9728
  3416923392
  30449698
  3325104969
  30449698
  *

這樣就徹底搞懂了Cookie如何寫入瀏覽器。

④ 客戶端訪問,有服務端寫入的Cookie。

這樣,一樣的URL再次訪問時,F12下:

image

很少解釋,看圖。

⑤ 服務器獲取

服務端這時呢?只要簡單的 getCookies() 就能夠獲取Cookie列表了。如圖,服務端控制檯打印以下:

image

泥瓦匠記憶小抄:Cookie傳輸小結

① 客戶端訪問,無服務端寫入的Cookie

② 服務端的Cookie寫入瀏覽器

③ 瀏覽器解析Cookie,保存至瀏覽器文件

④ 客戶端訪問,有服務端寫入的Cookie

⑤ 服務器獲取

4、談Cookie的做用到XSS(跨站點腳本攻擊)

Cookie沒有病毒那麼危險,但包含敏感信息。好比最多見的記住密碼,或者一些用戶常常瀏覽的網頁數據。如圖:

u=3426833575,3625518714&fm=21&gp=0

用戶不但願這些泄露,甚至被攻擊。但事實上存在這個攻擊,究竟怎麼攻擊呢?我在 跨腳本攻擊XSS 一文中也詳細介紹並提出解決方案。

全名:Cross Site Script,中文名:跨站腳本攻擊。顧名思義,是指「HTML注入」纂改了網頁,插入惡意的腳本,從而在用戶用瀏覽網頁的時候,控制用戶瀏覽器的一種攻擊。通常攻擊的套路如圖所示:

image_thumb7

5、總結

回顧全文,Cookie是HTTP協議中的一種會話機制。也明白下面兩個問題就行了

一、What 什麼是Cookie

二、How Cookie怎麼用,幹嗎用

相關文章
相關標籤/搜索