一、會話的概念
會話可簡單理解爲:用戶開一個瀏覽器,點擊多個超鏈接,訪問服務器多個web資源,然後關閉瀏覽器,整個過程稱之爲一個會話。
有狀態會話:一個同學來過教室,下次再來教室,我們會知道這個同學曾經來過,這稱之爲有狀態會話。
二、會話過程中要解決的一些問題?
每個用戶在使用瀏覽器與服務器進行會話的過程中,不可避免各自會產生一些數據,程序要想辦法爲每個用戶保存這些數據。
三、保存會話數據的兩種技術
3.1、Cookie
Cookie是客戶端技術,程序把每個用戶的數據以cookie的形式寫給用戶各自的瀏覽器。當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶着各自的數據去。這樣,web資源處理的就是用戶各自的數據了。
3.2、Session
Session是服務器端技術,利用這個技術,服務器在運行時可以爲每一個用戶的瀏覽器創建一個其獨享的session對象,由於session爲用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數據放在各自的session中,當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的session中取出數據爲用戶服務。
四、Cookie使用範例
4.1、使用cookie記錄用戶上一次訪問的時間
public class demoCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//設置服務器端以UTF-8編碼進行輸出
response.setCharacterEncoding("UTF-8");
//設置瀏覽器以UTF-8編碼進行接收,解決中文亂碼問題
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//獲取瀏覽器訪問訪問服務器時傳遞過來的cookie數組
Cookie[] cookies = request.getCookies();
//如果用戶是第一次訪問,那麼得到的cookies將是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也輸出到客戶端瀏覽器
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
4.2、設置cookie有效期
//用戶訪問過之後重新設置用戶的訪問時間,存儲到cookie中,然後發送到客戶端瀏覽器
Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//創建一個cookie,cookie的名字是lastAccessTime
//設置Cookie的有效期爲1天
cookie.setMaxAge(24*60*60);
//將cookie對象添加到response對象中,這樣服務器在輸出response對象中的內容時就會把cookie也輸出到客戶端瀏覽器
response.addCookie(cookie);
五、Cookie注意細節
- 一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。
- 一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。
- 瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制爲4KB。
- 如果創建了一個cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的cookie(即存儲在瀏覽器的內存中),用戶退出瀏覽器之後即被刪除。若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,並給出一個以秒爲單位的時間。將最大時效設爲0則是命令瀏覽器刪除該cookie。
5.1、刪除Cookie
注意:刪除cookie時,path必須一致,否則不會刪除
public class demoCookie2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//創建一個名字爲lastAccessTime的cookie
Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");
//將cookie的有效期設置爲0,命令瀏覽器刪除該cookie
cookie.setMaxAge(0);
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
5.2、cookie中存取中文
要想在cookie中存儲中文,那麼必須使用URLEncoder類裏面的encode(String s,String enc)方法進行中文轉碼,例如:
Cookie cookie = new Cookie("userName", URLEncoder.encode("孤傲蒼狼", "UTF-8"));
response.addCookie(cookie);
在獲取cookie中的中文數據時,再使用URLDecoder類裏面的decode(String s,String enc)進行解碼,例如:
URLDecoder.decode(cookies[i].getValue(), "UTF-8")