Servlet之可愛可氣的Cookie

          前言

                         Servlet的學習進行到Cookie了,對於Cookie也有了一個本身的理解。想着把本身的總結javascript

                  記錄下來,造成一份博客。話說筆者這幾天都沒寫博客了,忽然感受不知從何提及,真是有待html

                  提升啊。java

          Cookie介紹和由來

                       ●  Cookie你從哪裏來?
web

                       在前面的對HTTP的協議中,咱們知道了HTTP是一種無狀態的協議,這種方式使得web服務器瀏覽器

                  不知道用戶上一次訪問服務器幹了什麼,嚴重的阻礙了交互式web應用程序的實現。一個簡單的安全

                  例子就是咱們在登陸過一次網站後退出,在進行登陸還的去填寫登陸信息,雖然這種方式安全性服務器

                  比較高,不過總歸是一件特別麻煩的事。基於這種情形,Cookie技術就造成了。
cookie

                      ●  Cookie是什麼?併發

                       用大白話來講Cookie就是一堆數據,其組織形式是以鍵值對的形式組織的。在交互式web應用jsp

                   中十分有用,它是服務器在客戶端保存的一些信息,例如用戶名、密碼,這些信息是加密了的。

                   這就是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 		  //一、首先在服務器建立Cookies 		  Cookie nameCookie = new Cookie("username", username); 		  Cookie passCookie = new Cookie("password", password); 		  //二、設定cookie存在的時間 		  nameCookie.setMaxAge(30*60*24);//設置Cookie存在的時間,以秒爲單位 		  passCookie.setMaxAge(30*60*24); 		  //三、建立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

相關文章
相關標籤/搜索