使用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 |
|
普通方法 | 取得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注意細節
- 一個Cookie只能標識一種資訊,它至少含有一個標識該資訊的名稱(NAME)和設定值(VALUE)。
- 一個WEB站點可以給一個WEB瀏覽器傳送多個Cookie,一個WEB瀏覽器也可以儲存多個WEB站點提供的Cookie。
- 瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
- 如果建立了一個cookie,並將他傳送到瀏覽器,預設情況下它是一個會話級別的cookie(即儲存在瀏覽器的記憶體中),使用者退出瀏覽器之後即被刪除。若希望瀏覽器將該cookie儲存在磁碟上,則需要使用maxAge,並給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。
- cookie中存取中文
-
要想在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")