能夠簡單的理解爲:用戶打開瀏覽器,訪問多個web資源,而後關閉瀏覽器,這個過程能夠稱爲一次會話
php
有狀態會話:能夠簡單理解爲一個同窗來了這個教室,下一次再來咱們知道他來過這個教室,咱們能夠稱這個過程爲有狀態會話html
管理瀏覽器與客戶端之間會話過程當中產生的會話數據。java
實現資源之間的數據共享web
已經知道了其中兩個(ServletContext和Request)api
登陸場景:瀏覽器
打開瀏覽器 -> 瀏覽到登錄頁面 -> 輸入用戶名和密碼 -> 訪問到用戶主頁(顯示用戶名)緩存
修改密碼(輸入原密碼)服務器
修改收貨地址cookie
一、假設用Contextide
小張: 輸入「張三」 (保存數據: context.setAttribute("name","張三")) -> 用戶主頁(顯示「張三」)
小李: 輸入「李四」(保存數據:context.setAttribute("name","李四")) -> 用戶主頁(顯示「李四」)
問題: context是全部用戶公有的資源!!!會覆蓋數據。
二、假設使用request
小張: 輸入「張三」(保存數據: request.setAttribute("name","張三"))- > 用戶主頁(顯示「張三」)
問題: 必定要將凡有用戶信息的頁面都採用轉發技術!!!實現過於複雜和不易
這個時候咱們可使用cookie技術(Cookie技術:會話數據保存在瀏覽器客戶端。)
指某些網站爲了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數據(一般通過加密)。
用途:由於HTTP協議是無狀態的,即服務器不知道用戶上一次作了什麼,這嚴重阻礙了交互式Web應用程序的實現。在典型的網上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅乾和兩飲料。最後結賬時,因爲HTTP的無狀態性,不經過額外的手段,服務器並不知道用戶到底買了什麼。 因此Cookie就是用來繞開HTTP的無狀態性的「額外手段」之一。服務器能夠設置或讀取Cookies中包含信息,藉此維護用戶跟服務器會話中的狀態。
應用場景:Cookie另外一個典型的應用是當登陸一個網站時,網站每每會請求用戶輸入用戶名和密碼,而且用戶能夠勾選「下次自動登陸」。若是勾選了,那麼下次訪問同一網站時,用戶會發現沒輸入用戶名和密碼就已經登陸了。這正是由於前一次登陸時,服務器發送了包含登陸憑據(用戶名加密碼的某種加密形式)的Cookie到用戶的硬盤上。第二次登陸時,(若是該Cookie還沒有到期)瀏覽器會發送該Cookie,服務器驗證憑據,因而沒必要輸入用戶名和密碼就讓用戶登陸了。
Cookie的核心API
Cookie類的主要方法 |
|||
No. |
方法 |
類型 |
描述 |
1 |
構造方法 |
實例化Cookie對象,傳入cooke名稱和cookie的值 |
|
2 |
public String getName() |
普通方法 |
取得Cookie的名字 |
3 |
public String getValue() |
普通方法 |
取得Cookie的值 |
4 |
public void setValue(String newValue) |
普通方法 |
設置Cookie的值 |
5 |
public void setMaxAge(int expiry) |
普通方法 |
設置Cookie的最大保存時間,即cookie的有效期,當服務器給瀏覽器回送一個cookie時,若是在服務器端沒有調用setMaxAge方法設置cookie的有效期,那麼cookie的有效期只在一次會話過程當中有效,用戶開一個瀏覽器,點擊多個超連接,訪問服務器多個web資源,而後關閉瀏覽器,整個過程稱之爲一次會話,當用戶關閉瀏覽器,會話就結束了,此時cookie就會失效,若是在服務器端使用setMaxAge方法設置了cookie的有效期,好比設置了30分鐘,那麼當服務器把cookie發送給瀏覽器時,此時cookie就會在客戶端的硬盤上存儲30分鐘,在30分鐘內,即便瀏覽器關了,cookie依然存在,在30分鐘內,打開瀏覽器訪問服務器時,瀏覽器都會把cookie一塊兒帶上,這樣就能夠在服務器端獲取到客戶端瀏覽器傳遞過來的cookie裏面的信息了,這就是cookie設置maxAge和不設置maxAge的區別,不設置maxAge,那麼cookie就只在一次會話中有效,一旦用戶關閉了瀏覽器,那麼cookie就沒有了,那麼瀏覽器是怎麼作到這一點的呢,咱們啓動一個瀏覽器,就至關於啓動一個應用程序,而服務器回送的cookie首先是存在瀏覽器的緩存中的,當瀏覽器關閉時,瀏覽器的緩存天然就沒有了,因此存儲在緩存中的cookie天然就被清掉了,而若是設置了cookie的有效期,那麼瀏覽器在關閉時,就會把緩存中的cookie寫到硬盤上存儲起來,這樣cookie就可以一直存在了。 |
6 |
public int getMaxAge() |
普通方法 |
獲取Cookies的有效期 |
7 |
public void setPath(String uri) |
普通方法 |
設置cookie的有效路徑,好比把cookie的有效路徑設置爲"/xdp",那麼瀏覽器訪問"xdp"目錄下的web資源時,都會帶上cookie,再好比把cookie的有效路徑設置爲"/xdp/gacl",那麼瀏覽器只有在訪問"xdp"目錄下的"gacl"這個目錄裏面的web資源時纔會帶上cookie一塊兒訪問,而當訪問"xdp"目錄下的web資源時,瀏覽器是不帶cookie的 |
8 |
public String getPath() |
普通方法 |
獲取cookie的有效路徑 |
9 |
public void setDomain(String pattern) |
普通方法 |
設置cookie的有效域 |
10 |
public String getDomain() |
普通方法 |
獲取cookie的有效域 |
(1)、服務器段建立cookie的對象,同時把會話的數據存放到cookie中
//一、建立Cookie對象 Cookie cookie=new Cookie("name", "gqxing");
(2)、服務器端發送cookie信息到瀏覽器(同時對其設置一些附加操做)
//二、把cookie數據發送給瀏覽器(經過響應頭髮送:set-cookie) // response.setHeader("set-cookie",cookie.getName()+"="+cookie.getValue()); //以上方法太過於麻煩,如下方法直接以鍵值對的形式將cookie發送(推薦) response.addCookie(cookie);
(3)、瀏覽器收到cookie數據,將其放在瀏覽器端
(4)、瀏覽器在下次訪問服務器時,會帶着cookie信息。
將cookie的信息封裝在請求頭中。
(5)、服務器收到瀏覽器帶來的cookie信息
//三、接受瀏覽器返回的cookie信息 //String cookieValue=request.getHeader("cookie"); //以上方法不面向對象,使用下面方法 Cookie[] cookies=request.getCookies(); //注意須要判斷是否爲空 if (cookies!=null) { for (Cookie cookie2 : cookies) { String name=cookie2.getName(); String value=cookie2.getValue(); System.out.println(name+"="+value); } }else { System.out.println("沒有接收到cookie數據"); }
一、爲cookie設置訪問路徑,若瀏覽器初始的時候保留有兩個cookie值且其路徑以下所示:
Cookie cookie1=new Cookie("name", "gqxing"); Cookie cookie2=new Cookie("password", "123456"); /** * 設置cookie的有效路徑 * 默認狀況下:有效路徑在當前web應用下,/CookieSession *如今設置其路徑 */ cookie1.setPath("/CookieSession"); cookie2.setPath("/TestDemo"); response.addCookie(cookie1); response.addCookie(cookie2);
當瀏覽器訪問服務器的時候,發送請求的時候,同時訪問的路徑爲「/CookieSession」的時候
void setCookie(int expiry):設置coookie的有效時間
正整數:表示cookie數據保存在瀏覽器的緩存目錄中(硬盤),數值表示保存的時間
負整數:表示cookie數據保存在瀏覽器的內存中,瀏覽器關閉cookie的值就會遺失
零:表示刪除同名的cookie數據
如:
Cookie cookie =new Cookie("age", "21"); cookie.setPath("/CookieSession"); //表示該cookie會在瀏覽器的硬板上存在二十秒鐘,即便關閉瀏覽器,再打開仍是同樣存在 // cookie.setMaxAge(20); //爲負數,cookie會保留在內存中。又稱爲會話cookie(一次會話表明瀏覽器的關閉) cookie.setMaxAge(-1); response.addCookie(cookie); //接收cookie Cookie[] cookies=request.getCookies(); if (cookies!=null) { for (Cookie cookie2 : cookies) { System.out.println(cookie2.getName()+":"+cookie2.getValue()); } }else { System.out.println("沒有接收到相對應的cookie數據!"); }
當咱們不太想用某個cookie或者由於某種狀況須要刪除該cookie,咱們能夠用上面的方法,將其值設爲零
//將同一個路徑下的通名稱的cookie刪除掉 //要注意的是隻要cookie的名字相同就好就好,好比這裏的cookie的名字叫作「age」,注意在上面的代碼中咱們也設置一樣的「age」 Cookie cookie=new Cookie("age", "XXX"); cookie.setMaxAge(0); response.addCookie(cookie); System.out.println("刪除成功!");
注意:最好不要在cookie中設置中文,以避免亂碼。