Servlet的學習進行到Cookie了,對於Cookie也有了一個本身的理解。想着把本身的總結javascript
記錄下來,造成一份博客。話說筆者這幾天都沒寫博客了,忽然感受不知從何提及,真是有待html
提升啊。java
● Cookie你從哪裏來?
web
在前面的對HTTP的協議中,咱們知道了HTTP是一種無狀態的協議,這種方式使得web服務器瀏覽器
不知道用戶上一次訪問服務器幹了什麼,嚴重的阻礙了交互式web應用程序的實現。一個簡單的安全
例子就是咱們在登陸過一次網站後退出,在進行登陸還的去填寫登陸信息,雖然這種方式安全性服務器
比較高,不過總歸是一件特別麻煩的事。基於這種情形,Cookie技術就造成了。
cookie
● Cookie是什麼?併發
用大白話來講Cookie就是一堆數據,其組織形式是以鍵值對的形式組織的。在交互式web應用jsp
中十分有用,它是服務器在客戶端保存的一些信息,例如用戶名、密碼,這些信息是加密了的。
這就是Cookie,Cookie的信息並不大,就好像是小甜餅同樣。並且Cookie的大小通常不能超過
4kb。
知道了Cookie的由來和Cookie就是一堆鍵值對數據,那麼Cookie是如何和web服務器進行交
互 從而完成交互式的web應用的呢?簡單的看下圖就明白了:
具體流程以下圖:
瞭解了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有一些缺陷,此部分參照維基百科:
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