1. 程式人生 > >使用Cookie進行會話管理

使用Cookie進行會話管理

一、會話的概念

  會話可簡單理解為:使用者開一個瀏覽器,點選多個超連結,訪問伺服器多個web資源,然後關閉瀏覽器,整個過程稱之為一個會話。   有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學曾經來過,這稱之為有狀態會話。

二、會話過程中要解決的一些問題?

  每個使用者在使用瀏覽器與伺服器進行會話的過程中,不可避免各自會產生一些資料,程式要想辦法為每個使用者儲存這些資料。

三、儲存會話資料的兩種技術

3.1、Cookie

  Cookie是客戶端技術,程式把每個使用者的資料以cookie的形式寫給使用者各自的瀏覽器。當用戶使用瀏覽器再去訪問伺服器中的web資源時,就會帶著各自的資料去。這樣,web資源處理的就是使用者各自的資料了。

3.2、Session

  Session是伺服器端技術,利用這個技術,伺服器在執行時可以為每一個使用者的瀏覽器建立一個其獨享的session物件,由於session為使用者瀏覽器獨享,所以使用者在訪問伺服器的web資源時,可以把各自的資料放在各自的session中,當用戶再去訪問伺服器中的其它web資源時,其它web資源再從使用者各自的session中取出資料為使用者服務。

四、Java提供的操作Cookie的API

Java中的javax.servlet.http.Cookie類用於建立一個Cookie

                                          Cookie類的主要方法

NO. 方法 型別 描述
1 構造方法 例項化Cookie物件,傳入cooke名稱和cookie的值
2
public String getName()
普通方法  取得Cookie的名字
3 public String getValue() 普通方法 取得Cookie的值
4 public void setVaule(String newValue ) 普通方法 設定Cookie的值
5 public void setMaxAge(int expiry)  普通方法 設定Cookie的最大儲存時間,即cookie的有效期,我們啟動一個瀏覽器,就相當於啟動一個應用程式,而伺服器回送的cookie首先是存在瀏覽器的快取中的,當瀏覽器關閉時,瀏覽器的快取自然就沒有了,所以儲存在快取中的cookie自然就被清掉了,而如果設定了cookie的有效期,那麼瀏覽器在關閉時,就會把快取中的cookie寫到硬碟上儲存起來,這樣cookie就能夠一直存在了。
6 public int getMaxAge() 普通方法 取得Cookie的有效期
7 public void setPath(String url) 普通方法 設定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的有效域

response介面也中定義了一個addCookie方法,它用於在其響應頭中增加一個相應的Set-Cookie頭欄位。 同樣,request介面中也定義了一個getCookies方法,它用於獲取客戶端提交的Cookie。

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.naming.Context;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * 獲取使用者上一次訪問時間
 */
public class CookieDemo extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
  //獲取瀏覽器訪問訪問伺服器時傳遞過來的cookie陣列
    Cookie[] cookies = request.getCookies();
    
    //如果第一次訪問,cookie為null
    if(cookies!=null) {
    	 out.write("您上次訪問的時間是:");
    	 for(int i=0;i<cookies.length;i++) {
    	 Cookie cookie = cookies[i];
    	 if (cookie.getName().equals("lastAccessTime")) {
             Long lastAccessTime =Long.parseLong(cookie.getValue());
             Date date = new Date(lastAccessTime);
             out.write(date.toLocaleString());

    	 }
    }
    }else {
    	out.write("第一次");	 
    	 
    }
  //使用者訪問過之後重新設定使用者的訪問時間,儲存到cookie中,然後傳送到客戶端瀏覽器
    Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//建立一個cookie,cookie的名字是lastAccessTime
    //將cookie物件新增到response物件中,這樣伺服器在輸出response物件中的內容時就會把cookie也輸出到客戶端瀏覽器
  //設定Cookie的有效期為1天
    cookie.setMaxAge(24*60*60);
    
    response.addCookie(cookie);
}

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

六、Cookie注意細節

  1. 一個Cookie只能標識一種資訊,它至少含有一個標識該資訊的名稱(NAME)和設定值(VALUE)。
  2. 一個WEB站點可以給一個WEB瀏覽器傳送多個Cookie,一個WEB瀏覽器也可以儲存多個WEB站點提供的Cookie。
  3. 瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
  4. 如果建立了一個cookie,並將他傳送到瀏覽器,預設情況下它是一個會話級別的cookie(即儲存在瀏覽器的記憶體中),使用者退出瀏覽器之後即被刪除。若希望瀏覽器將該cookie儲存在磁碟上,則需要使用maxAge,並給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。
  5. cookie中存取中文
  6. 要想在cookie中儲存中文,那麼必須使用URLEncoder類裡面的encode(String s, String enc)方法進行中文轉碼,例如:

    1 Cookie cookie = new Cookie("userName", URLEncoder.encode("程新宇", "UTF-8"));
    2 response.addCookie(cookie);

      在獲取cookie中的中文資料時,再使用URLDecoder類裡面的decode(String s, String enc)進行解碼,例如:

    1 URLDecoder.decode(cookies[i].getValue(), "UTF-8")