1. 程式人生 > >會話技術介紹及 Cookie

會話技術介紹及 Cookie

一、會話技術介紹

1. 會話:為了實現某一個需求,瀏覽器和伺服器之間會產生多次的請求和響應;

從開啟瀏覽器訪問伺服器開始,到訪問伺服器結束關閉瀏覽器,

之間的多次請求和響應稱為  “瀏覽器和伺服器之間的一次會話”

2. 會話中的資料儲存問題

如果使用request域的話,其是一次請求一次響應,作用範圍太小;

如果使用ServletContext域的話,代表整個web應用,容易混亂;

所以採用Cookie技術和Session技術

一、定義

1.Cookie工作原理

  Cookie是通過Cookie請求頭Set-Cookie響應頭,將會話中的資料  儲存在客戶端 ; 是客戶端的技術 ;

  具體如下圖:

二、相關操作

1.  建立Cookie

Cookie cookie = new Cookie(String name, String value);//建立Cookie 物件

cookie.getName();//獲取Cookie的名字
cookie.getValue();//獲取Cookie的值

cookie.setValue(String value);//設定Cookie的值

cookie.setPath(request.getContextPath()+"/");//在訪問該應用下的任何一個資源時都能夠將Cookie帶回來

cookie

.setMaxAge(0);

2.  將Cookie新增到響應中

response.addCookie(Cookie cookie);

//將Cookie物件新增到response響應中, 可以多次呼叫該方法, 將多個Cookie新增到響應中.

3.  獲取請求中的Cookie

request.getCookies();

//該方法會返回請求中所有的Cookie物件組成的陣列, ;如果請求中沒有任何Cookie資訊, 則返回null

4. 刪除Cookie

1) 可以間接刪除Cookie:可以向瀏覽器再發一個同名、同path、同domain

(如果前後都不設定, 則domain預設是相同的)的Cookie  ;   

     由於瀏覽器是根據Cookie的名字+path+domain來區分一個Cookie的,如果兩個Cookie的名字+path+domain完全一致,則瀏覽器會認為是同一個Cookie,這時後發的Cookie會覆蓋之前傳送的Cookie,而後發的Cookie只要設定setMaxAge方法值為0,瀏覽器收到之後也會將後發的Cookie立即刪除

三、常用方法

1. setMaxAge() 設定Cookie的最大存活時間(S)

如果不設定該方法, Cookie是預設儲存在瀏覽器的記憶體中, (即預設生命週期為一次會話時間

如果中途關閉瀏覽器, 隨著瀏覽器記憶體的釋放, 該Cookie資訊也隨著記憶體的釋放而丟失!

如果設定該方法, Cookie將會以檔案的形式儲存在瀏覽器的臨時資料夾中

2. setPath()   設定cookie被瀏覽器帶回來的路徑

1)  Cookie被瀏覽器帶回來的路徑預設是傳送cookie的Servlet所在的路徑 

<< ----  >>  cookie被瀏覽器帶回來的路徑就是 CookieDemo2 所在的路徑:http://localhost/day16_2/,這就是根路徑

這時, 瀏覽器在訪問day16_2應用下任何一個資源時都可以帶著Cookie, 例如:http://localhost/day16_2/aaa

2)這時希望該應用下的任何一個資源都可以將Cookie帶回來 

這時則需要設定Cookie的路徑為當前WEB應用的根路徑:  cookie.setPath(request.getContextPath()+”/”);

備註:後面拼上斜槓的目的是:如果當前WEB應用是預設的WEB應用, 則通過getContextPath方法獲取到的WEB應用的路徑為一個空字串, 而路徑不能為空, 所以後面拼上一個斜槓

四、應用

1、當用戶訪問網站時,可以獲取上次訪問的時間

String dateStr1= new Date().toString();
Cookie cookie = new Cookie("time",dataStr1);
response.addCookie(cookie);//將cookie新增到response傳送給瀏覽器

......

Cookie[] cookie = request.getCookies();
if(cookies != null){
   for(Cookie c : cookies){
       if("time".equal(c.getName)){
            response.getWriter().write("上次訪問的時間為"+c.getValue);
       }
   }
}