【菜鳥學Java】10:Cookie技術

連江偉發表於2016-01-18

        什麼是Cookie?

        Cookie是當你瀏覽某網站時,網站儲存在你機器上的一個小文字檔案,它記錄了你的使用者ID,密碼、瀏覽過的網頁、停留的時間等資訊,當你再次來到該網站時,網站通過讀取Cookie,得知你的相關資訊,就可以做出相應的動作,如在頁面顯示歡迎你的標語,或者讓你不用輸入ID、密碼就直接登入等。

        Cookie是由伺服器端生成,傳送給User-Agent(一般是瀏覽器),瀏覽器會將Cookie的key/value儲存到某個目錄下的文字檔案內,下次請求同一網站時就傳送該Cookie給伺服器(前提是瀏覽器設定為啟用cookie)。Cookie名稱和值可以由伺服器端開發自己定義,對於JSP而言也可以直接寫入jsessionid,這樣伺服器可以知道該使用者是否是合法使用者以及是否需要重新登入等,伺服器可以設定或讀取Cookies中包含資訊,藉此維護使用者跟伺服器會話中的狀態。


        Cookie的原理?

        首先給大家看一張從網上找的一張圖,我覺得不錯,能夠幫助大家理解,如下所示:

        簡單的說一下Cookie的原理:

        客戶端在第一次向瀏覽器傳送請求Request的時候,做了特定的操作,比如:選擇了記住密碼的選項。到達服務端之後,服務端作出響應,傳送給客戶端需要的請求,同時會在響應Response中新增一個Cookie的物件,這個物件儲存的資訊通過Set-Cookie進行攝入。這樣客戶端就可以儲存它和伺服器的會話資訊了,等到客戶端再次向伺服器傳送請求Request時,就會帶著Cookie物件的資訊,這樣伺服器就可以根據Cookie的資訊,對客戶端做出相應的響應。

 

        怎麼用Cookie?

        關於如何在我們的程式中應用Cookie,來看一個小例子——儲存使用者名稱。

        新建一個DServlet,用來充當伺服器,使用JSP頁面充當客戶端,來模擬Cookie的工作原理,配置檔案啥的就不說了。服務端的程式碼如下:

public class DServlet extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
			// 1.獲得使用者名稱
			String  userName = 	request.getParameter("userName");
			Cookie cookie = new Cookie("remember",userName);
			
			// 2.獲得核取方塊選中狀態
			String remember = request.getParameter("remember");
			
			// 3.根據剛才判斷的狀態.建立cookie,並設定有效時間
			if(remember!=null && remember.equals("yes")){
				//需要記住密碼 ==> 記兩個禮拜
				cookie.setMaxAge(60*60*24*7*2);
			}else{
				//不需要記住密碼 或 刪除已經記住的密碼
				cookie.setMaxAge(0);
			}
			
			// 4.向客戶端傳送cookie
			response.addCookie(cookie);
			
			// 5.跳轉登陸成功頁面
			response.sendRedirect("/day11-cookie/index.jsp");
	}

}

        登入的JSP頁面程式碼如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>登入</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">

  </head>
  	<%
  		//取得瀏覽器傳送過來的cookie
  		Cookie[] cookies = request.getCookies();
  		Cookie cookie = null;
  		if(cookies!=null &&cookies.length>0){
  			for(Cookie c : cookies){
  				if(c.getName().equals("remember")){
  					cookie = c;
  				}
  			}
  		}
  		//取得到 ==> 將取到的使用者名稱填入到 輸入框中
  		if(cookie!=null){
  			String userName = cookie.getValue();
  			//將cookie中記錄的使用者名稱放到 page域
  			pageContext.setAttribute("userName", userName);
  		}
  		//取不到 ==> 什麼也不做
  	 %>
  
  <body>
    	<form action="/day11-cookie/DServlet" method="post" >
    		使用者名稱:<input type="text"  name="userName" value="<%=pageContext.getAttribute("userName")==null?"":pageContext.getAttribute("userName") %>" /><br/>
    		密   碼:<input type="password" /><br/>
    		            <input type="checkbox" name="remember" value="yes" <%=pageContext.getAttribute("userName")==null?"":"checked"%> />記住我<br/>
    		<input type="submit" value="登陸" style="width:100px;height:40px" /><br/>
    	</form>
  </body>
</html>

        不勾選“記住我”,我們點選登陸,檢視一下瀏覽器的Cookie資訊(以Firefox為例),如下圖所示:

       

        我們看到Cookie中除了程式執行的會話JSESSIONID之外,並沒有其他的Cookie資訊,而當我們在登陸的時候,將記住我勾選,則會看到Cookie資訊中有了我們新增的內容,並且內容就是我們填寫的使用者名稱,這樣在下一次登陸時,自動填寫使用者名稱。

 

        小結一下:

        Cookie的應用,的確為我們帶來了很多便利,比如幾乎所有的購物網站都有的購物車功能,若是沒有Cookie或者類似技術,是不可能實現的,還有我們買車票的時候,會提示在限定的時間內完成支付等等都需要Cookie技術的支援。當時Cookie也有其自身的問題。

        第一,安全性問題,眾所周知,Cookie通常儲存著使用者的敏感資訊,因此Cookie也就成為了眾多Hacker關注的物件,藉此來取得特殊許可權、甚至攻克整個網站。比如Cookie欺騙,但是我們也可以通過JavaScript等技術對其進行控制。

        第二,很多場合的電腦是公用的,因此你在某些網站所做的設定就會保留在這臺電腦上,當別人再使用這臺電腦的時候就可能會看到你的資訊。

        第三,當我們的瀏覽器出了問題,在解決的時候,可能會將你電腦上所有的Internet臨時檔案刪除,這樣的話你的所有Cookie檔案將會丟失。當你再次訪問之前的網站時,你所設定的一些個性化設定將不復存在,網站就會將你視為一個新的使用者。同理,當你使用不同的電腦,訪問同一個網站時,網站也是會將你當做幾個使用者來對待,因為幾個電腦的Cookie資訊不一樣。

相關文章