前言
Servlet的學習進行到Cookie了,對於Cookie也有了一個自己的理解。想着把自己的總結
記錄下來,形成一份博客。話說筆者這幾天都沒寫博客了,突然感覺不知從何說起,真是有待
提高啊。
Cookie介紹和由來
● Cookie你從哪裏來?
在前面的對HTTP的協議中,我們知道了HTTP是一種無狀態的協議,這種方式使得web服務器
不知道用戶上一次訪問服務器幹了什麼,嚴重的阻礙了交互式web應用程序的實現。一個簡單的
例子就是我們在登錄過一次網站後退出,在進行登錄還的去填寫登錄信息,雖然這種方式安全性
比較高,不過總歸是一件特別麻煩的事。基於這種情形,Cookie技術就形成了。
● Cookie是什麼?
用大白話來說Cookie就是一堆數據,其組織形式是以鍵值對的形式組織的。在交互式web應用
中十分有用,它是服務器在客戶端保存的一些信息,例如用戶名、密碼,這些信息是加密了的。
這就是Cookie,Cookie的信息並不大,就好像是小甜餅一樣。而且Cookie的大小一般不能超過
4kb。
Cookie和web服務器的交互
知道了Cookie的由來和Cookie就是一堆鍵值對數據,那麼Cookie是如何和web服務器進行交
互 從而完成交互式的web應用的呢?簡單的看下圖就明白了:
具體流程如下圖:
Cookie可愛之處
瞭解了Cookie與服務器的交互過程,我們思考一個問題:cookie究竟能幹什麼?
典型的應用就是判定用戶註冊是是否已經註冊(實現檢測是否存在cookie可以減輕服務器壓力)、
記住用戶名、密碼功能可以讓我們登錄網站的時候快捷一些,網上商店購物車的運用。
源碼實例
知道了Cookie的可愛之處,那麼我們來看看Cookie在Servle中是如何來操作的吧?
這裏我們以一個簡單的“登錄記住”爲例。通過Cookie實現下次登錄記住用戶名,
密碼的功能。
首先看看LoginServle的代碼情況,這裏主要是在doPost方法中處理的。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); String record = request.getParameter("record"); //第一次登陸根據record是否被選擇來確定是否使用cookie if(record.equals("yes")) { //使用cookie //1、首先在服務器創建Cookies Cookie nameCookie = new Cookie("username", username); Cookie passCookie = new Cookie("password", password); //2、設定cookie存在的時間 nameCookie.setMaxAge(30*60*24);//設置Cookie存在的時間,以秒爲單位 passCookie.setMaxAge(30*60*24); //3、創建cookie並保存到客戶端 response.addCookie(nameCookie); response.addCookie(passCookie); //用戶名驗證 if(username.equals("kiritor")&&password.equals("kiritor")) request.getRequestDispatcher("index.jsp").forward(request, response); else request.getRequestDispatcher("error.jsp").forward(request, response); } }這樣我們在用戶第一次登錄之後,用戶如果選擇記住密碼之後,服務器就生成了
cookie對象並通過response對象將其保存在客戶端瀏覽器中了。下次登錄的時候我們
就可以通過javaScript代碼動態的獲取用戶名,密碼了。
詳細情況看代碼部分。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>登錄</title> </head> <body> <P></P> <P></P> <center> <form action="LoginServlet" method="post" name="form_name"> 用戶名:<input type="text" name="username" /></br> 密 碼:<input type="password" name="password" /></br> 記住密碼<input type="radio" name="record" value="yes" /> <input type="submit" value="提交" /> </form> </center> <script type="text/javascript"> //js獲取cookie var acookie = document.cookie.split("; "); function getck(sname) {//獲取單個cookies for ( var i = 0; i < acookie.length; i++) { var arr = acookie[i].split("="); if (sname == arr[0]) { if (arr.length > 1) return unescape(arr[1]); else return ""; } } return ""; } //給相應的form裏的input賦值 document.form_name.username.value = getck("username"); document.form_name.password.value = getck("password"); </script> </body> </html>可以預見的是進過第一次記住密碼並登錄之後,下次登錄就不需要用戶手動輸入密碼了。
好了一個簡單的Cookie例子就完成了,在Servlet中對Cookie到底具有什麼操作,這裏我們可以
直接閱讀Servlet源碼,這裏筆者對其方法做一個簡單的展示
見名知意,根據名字我們就可以得出其方法的目的了,具體作用是什麼,筆者也不想多提了。
Cookie藏哪兒?
Cookie的數據時加密的,這裏我們想看看它到底長個什麼樣子。那麼Cookie到底藏在哪裏
呢? 這個不同瀏覽器貌似不同。讀者如果感興趣的話可以自己找找看。
可氣的Cookie
對於Cookie有一些缺陷,此部分參照維基百科:
http://zh.wikipedia.org/wiki/Cookie
● 不安全性
通過上面的學習我們知道cookie是保存在客戶端的,雖然cookie是經過了加密的,但是仍然
存在着極大的安全隱患。
Cookie在HTTP請求是明文傳遞的,雖然經過加密,但是解密更加強大,Cookie在某種程度
上來說已經嚴重的危機到用戶的隱私安全了,很多情況下,我們接收到的垃圾郵件都是由於使
用cookie造成的。
● 識別不精確
如果在一臺計算機中安裝多個瀏覽器,每個瀏覽器都會以獨立的空間存放cookie。因爲cookie
中不但可以確認用戶,還能包含計算機和瀏覽器的信息,所以一個用戶用不同的瀏覽器登錄或者
用不同的計算機登錄,都會得到不同的cookie信息,另一方面,對於在同一臺計算機上使用同一
瀏覽器的多用戶羣,cookie不會區分他們的身份,除非他們使用不同的用戶名登錄。
● 增加流量
Cookie會被附加到每個HTTP請求中,佔用了流量
● 存儲的數據量太小
Cookie只支持最多4kb的數據,能夠給予的存儲空間太小
● 偷竊Cookie和腳本***
雖然cookies沒有中電腦病毒那麼危險,但它仍包含了一些敏感信息:用戶名,電腦名,
使用的瀏覽器和曾經訪問的網站。用戶不希望這些內容泄漏出去,尤其是當其中還包含有私人
信息的時候。
這並非危言聳聽,跨站點腳本(Cross site scripting)可以達到此目的。在受到跨站點腳本
***時,cookie盜賊和cookie毒藥將竊取內容。一旦cookie落入***者手中,它將會重現其價
值。
Cookie盜賊:蒐集用戶cookie併發給***者的***。***者將利用cookie信息通過合法手
段進入用戶帳戶。
Cookie投毒:一般認爲,Cookie在儲存和傳回服務器期間沒有被修改過,而***者會在
cookie送回服務器之前對其進行修改,達到自己的目的。例如,在一個購物網站的
cookie中包含了 顧客應付的款項,***者將該值改小,達到少付款的目的。
這就是cookie 投毒。
總結
Cookie可以幫我們完成一些特別的功能。Cookie有許多的缺陷,但是在一些對安全性要求不
高的應用中,我們還是可以藉助Cookie來實現業務需求的。
對於Cookie的缺陷問題,現在也有一些替代方法,這裏筆者可以上網自己查閱下:
給個維基百科上的替代方法:http://zh.wikipedia.org/wiki/Cookie