Servlet之可愛可氣的Cookie

          前言

                         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

     


   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章