會話數據的保存——cookie

會話的理解

  能夠簡單的理解爲:用戶打開瀏覽器,訪問多個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(String name, String value)

構造方法

實例化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的有效域

 

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」的時候

二、設置cookie的有效時間

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的名字相同就好就好,好比這裏的cookie的名字叫作「age」,注意在上面的代碼中咱們也設置一樣的「age」
		Cookie cookie=new Cookie("age", "XXX");
		cookie.setMaxAge(0);
		response.addCookie(cookie);
		System.out.println("刪除成功!");        

 

注意:最好不要在cookie中設置中文,以避免亂碼。

相關文章
相關標籤/搜索