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

來源:互聯網
上載者:User

標籤:

Writer      :BYSocket(泥沙磚瓦漿木匠)

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

上一篇 圖解Http協議 ,這次繼續Http家族中的Cookie。泥瓦匠最近看到部落格園中一篇好文,

這就是因為瀏覽器Cookie太大,導致請求時,要求標頭域過大造成發送失敗。下面咱們就瞭解瞭解Cookie。按著以前的思路圖文並茂哈,沒圖說個XX。

 

一、概述

首先從HTTP說起,Cookie是Http協議中那部分呢?

Cookie是什嗎?

自問自答:Cookie是要求標頭域和回應標頭域的欄位。簡單地說,就是伴隨請求和響應的一組索引值對的文本,小文本。所以稱之為”Cookie“餅乾。Cookie的生命來源於伺服器。首先是用戶端請求服務端,此時請求為第一次,無Cookie參數。這時候,服務端setCookie發送給用戶端。記住,Cookie來源自服務端

Cookie有什麼用呢?

又自問自答:Cookie來源自服務端,當然服務於客戶。就像你我的會話,文字是在我們之間傳遞的。所以Cookie用於服務端和用戶端的會話。因為Http協議是無狀態的,Cookie就是維持會話,說白了就是傳遞資料的額外媒介。

下面我們訪問百度地址。

① 產生於服務端Response,在回應標頭域

② 要求標頭域是這樣的:(可以在Cookie Tab頁發現,和響應有一樣的)

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

 

二、詳細介紹Cookie 傳輸過程

直接,一一詳細解釋。順便寫個CookieServlet,類比一下Cookie的一生。代碼如下:

?
1234567891011121314151617181920212223242526272829303132333435363738 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資訊及一些關於時間的。

?
123456789 CookieNameCookieValuelocalhost/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怎麼用,幹嘛用

Writer      :BYSocket(泥沙磚瓦漿木匠)

微         博:BYSocket

豆         瓣:BYSocket

FaceBook:BYSocket

Twitter    :BYSocket

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.