[toc]
### 一、會話的概念
會話可以簡單理解為:用戶開了一個瀏覽器,點擊多個超鏈接,訪問服務器多個web資源,然后關閉服務器,<b>整個過程就是一個會話</b>。
有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學曾經來過,這就叫有狀態會話。
### 二、會話過程中要解決的一些問題
每個用戶在使用瀏覽器與服務器進行會話的過程中,不可避免各自會產生一些數據,程序要想辦法為每個用戶保存這些數據。
### 三、保存會話數據的兩種技術
3.1、Cookie
cookie是<b>客戶端技術</b>,程序把每個用戶的數據以cookie的形式寫給用戶各自的瀏覽器。當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶著各自的數據去。這樣web資源處理的就是用戶各自的數據了。
3.2、Session
Session是<b>服務端技術</b>,利用這個技術,服務器在運行時可以為每個用戶的瀏覽器創建一個其獨享的session對象,<b>不同的是cookie保存在客戶端服務器上,session保存在服務器上</b>。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,當客戶端瀏覽器再次訪問時只需從該session中查找該客戶的狀態就可以了。
### 四、cookie的API


### 五、cookie使用范例
5.1 使用cookie記錄用戶上一次訪問時間
~~~
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
Cookie[] cookies = req.getCookies();
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()+"");
resp.addCookie(cookie);
}
~~~
訪問網站界面如下:

在上面的例子中,在程序代碼中并沒有使用setMaxAge方法設置cookie的有效期,所以當關閉瀏覽器之后,cookie就失效了,想要cookie在關閉瀏覽器之后仍有效,那么在創建cookie的時候,就為cookie設置一個有效期。
~~~
Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
//設置有效期為1天
cookie.setMaxAge(24*60*60);
//將cookie對象添加到response對象中,這樣服務器在輸出response對象中的內容時就會把cookie也輸出到客戶端服務器
resp.addCookie(cookie);
~~~
### 六、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。**