您好,登錄后才能下訂單哦!
cookie,有時我們也用其復數形式?cookies,是服務端保存在瀏覽器端的數據片段。以?key/value的形式進行保存。每次請求的時候,請求頭會自動包含本網站此目錄下的?cookie 數據。網站經常使用這個技術來識別用戶是否登陸等功能。
簡單的說,cookie 就是服務端留給計算機用戶瀏覽器端的小文件。
HTTP???是無狀態協議,服務器不能記錄瀏覽器的訪問狀態,也就是說服務器不能區分中兩次請求是否由一個客戶端發出。這樣的設計嚴重阻礙的?Web?程序的設計。如:在我們進行網購時,買了一條褲子,又買了一個手機。由于?http?協議是無狀態的,如果不通過其他手段,服務器是不能知道用戶到底買了什么。而?Cookie?就是解決方案之一。
Cookie?實際上就是服務器保存在瀏覽器上的一段信息。瀏覽器有了?Cookie?之后,每次向服務器發送請求時都會同時將該信息發送給服務器,服務器收到請求后,就可以根據???該信息處理請求。
例如:我們上文說的網上商城,當用戶向購物車中添加一個商品時,服務器會將這個條信息封裝成一個?Cookie?發送給瀏覽器,瀏覽器收到Cookie,會將它保存在內存中(注意這里的內存是本機內存,而不是服務器內存),那之后每次向服務器發送請求,瀏覽器都會攜帶該?Cookie,而服務器就可以通過讀取?Cookie?來判斷用戶到底買了哪些商品。當用戶進行結賬操作時,服務器就可以根據?Cookie?的信息來做結算。
Cookie?的用途:?網上商城的購物車?保持用戶登錄狀態
Cookie?的缺點
Cookie 做為請求或響應報文發送,無形中增加了網絡流量。
Cookie 是明文傳送的安全性差。
Cookie?中保存數據是不穩定的,用戶可以隨時清理?cookie,各個瀏覽器對?Cookie 有限制,使用上有局限
chrome?的?cookie 位置:
C:\Users\lfy\AppData\Local\Google\Chrome\User Data\Default\Cookies
ie?中?cookie?位?置?:?C:\Users\lfy\AppData\Local\Microsoft\Windows\InetCache 點擊設置->查看對象即可
chrome?中查看?cookie
cookie 如上圖所示
從上圖可以看出?cookie 是鍵值對的形式,有過期時間(Max-Age,session 表示在這個會話期內有效)。
1)總的來看?Cookie?像是服務器發給瀏覽器的一張“會員卡”,瀏覽器每次向服務器發送請求時都會帶著這張“會員卡”,當服務器看到這張“會員卡”時就可以識別瀏覽器的身份。實際上這個所謂的“會員卡”就是服務器發送的一個響應頭:
?
2)如圖?Set-Cookie?這個響應頭就是服務器在向服務器發“會員卡”,這個響應頭的名字是 Set-Cookie , 后 邊 JSESSIONID=95A92EC1D7CCB4ADFC24584CB316382E 和?Path=/Test_cookie,是兩組鍵值對的結構就是服務器為這個“會員卡”設置的信息。瀏覽器收到該信息后就會將它保存到內存或硬盤中。
3)當瀏覽器再次向服務器發送請求時就會攜帶這個?Cookie 信息:
cookie?是由服務端創建的,由瀏覽器端保存的。所以創建對象我們應該在服務端創建?cookie,cookie 的創建方法:
1)創建一個?CookieServlet
在?Servlet?的?doPost()方法中編寫如下代碼:
//創建一個Cookie對象Cookie?cookie?=?new?Cookie("username",?"zhangsan");//將Cookie對象放入response對象中response.addCookie(cookie);
?
2)在瀏覽器中訪問該?Servlet,會發現響應頭中出現如下內容:?Set-Cookie: username=zhangsan
如此就成功的向瀏覽器設置了一個?Cookie,當我們在刷新頁面時會發現瀏覽器的請求頭中出現如下代碼:
Cookie: username=zhangsan
3)同樣我們還可以同時設置多個?Cookie:
//創建一個Cookie對象Cookie?cookie1?=?new?Cookie("username",?"zhangsan");? Cookie?cookie2?=?new?Cookie("password",?"123456");? Cookie?cookie3?=?new?Cookie("age",?"20");//將Cookie對象放入response對象中response.addCookie(cookie1); response.addCookie(cookie2); response.addCookie(cookie3);
瀏覽器會按以下形式發送?Cookie:
Cookie: username=zhangsan; password=123456; age=20
4)設置?Cookie?就是兩個步驟:?創建?Cookie 對象
將?Cookie?對象加入到?response 中
1)經過上邊的介紹我們已經知道?Cookie ?是存儲在瀏覽器中的,但是可想而知一般情況下瀏覽器不可能永遠保存一個?Cookie,一來是占用硬盤空間,再來一個?Cookie 可能只在某一時刻有用沒必要長久保存。
2)?所以我們還需要為?Cookie?設置一個有效時間。
3)通過?Cookie?對象的?setMaxAge()可以設置?Cookie 的有效時間。
其中?setMaxAge()接收一個?int 型的參數,來設置有效時間。參數主要有一下四種情況:
設置為?0,setMaxAge(0)
Cookie?立即失效,下次瀏覽器發送請求將不會在攜帶該?Cookie
設置大于?0,setMaxAge(60)
表示有效的秒數?60?就代表?60?秒即?1?分鐘,也就是?Cookie?在?1 分鐘后失效。
設置小于?0,setMaxAge(-1)
設置為負數表示當前會話有效。也就是關閉瀏覽器后?Cookie 失效
不設置
如果不設置失效時間,則默認當前會話有效。
1)?Cookie?的路徑指告訴瀏覽器訪問那些地址時該攜帶該?Cookie,我們知道瀏覽器會保存很多不同網站的?Cookie,比如百度的?Cookie,新浪的?Cookie,騰訊的?Cookie?等等。那我們不可能訪問百度的時候攜帶新浪的?Cookie,也不可能訪問每個網站時都帶上所有的?Cookie?這是不現實的,所以往往我們還需要為?Cookie?設置一個?Path?屬性,來告訴瀏覽器何時攜帶該?Cookie。
2)我們同過?Cookie?的?setPath()來設置路徑,這個路徑是由瀏覽器來解析的所以/代表服務器的根目錄。
如:設置為?/項目名/路徑? cookie.setPath(“/項目名/路徑”),這樣設置只有訪問“/項目名/路徑”下的的資源才會攜帶?Cookie
如:/項目名/路徑/1.jsp 、/項目名/路徑/hello/2.jsp 等
如果不設置,默認會在訪問“/項目名”下的資源時攜帶如:“/項目名/index.jsp”?、?“/項目名/hello/index.jsp”
Cookie?cookie?=??Cookie("username",?"abc");?cookie.setMaxAge(60*60*24);cookie.setPath(getServletContext().getContextPath()+"/");? resp.addCookie(cookie);? resp.sendRedirect(getServletContext().getContextPath()+"/index.jsp");
通過以上步驟,我們將?cookie?保存到了瀏覽器端。那么我們如何讀取?cookie 中的值呢。分析:
cookie?被設置進入瀏覽器后,每次請求都會攜帶?cookie?的值,所以我們需要從?request 中取出?cookie 進行解析。
//從request中獲取所有cookieCookie[]?cookies?=?request.getCookies();//遍歷cookiefor(Cookie?c:cookies){ String?cName?=?c.getName();//獲取cookie名String?cValue?=?c.getValue();//獲取cookie值 System.out.println("cookie:"?+?cName?+?"="?+cValue); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。