會話技術 1. 會話:一次會話中包含多次請求和響應 一次會話:瀏覽器第一次給伺服器發送請求,會話建立,直到有一方斷開為止 2. 功能:在一次會話的範圍內的多次請求間,共用數據 3. 方式: 1. 客戶端會話技術:Cookie 2. 伺服器端會話技術:Session Cookie 1. 概念:客戶端會 ...
會話技術
- 會話:一次會話中包含多次請求和響應
- 一次會話:瀏覽器第一次給伺服器發送請求,會話建立,直到有一方斷開為止
- 功能:在一次會話的範圍內的多次請求間,共用數據
- 方式:
- 客戶端會話技術:Cookie
- 伺服器端會話技術:Session
Cookie
-
概念:客戶端會話技術,將數據保存到客戶端
-
快速入門:
- 使用步驟:
- 創建Cookie對象,綁定數據
- new Cookie(String name,String value)
- 發送Cookie對象
- response.addCookie(Cookie cookie)
- 獲取Cookie,拿到數據
- Cookie[] request.get
- 創建Cookie對象,綁定數據
- 使用步驟:
-
實現原理
- 基於響應頭set-cookie 和請求頭cookie實現
-
Cookie的細節
-
一次可不可以發送多個Cookie
- 可以
- 可以創建多個Cookie對象,使用response調用多次addCookie方法發送cookie即可
-
Cookie在瀏覽器保存多長時間
- 預設情況:當瀏覽器關閉後,Cookie數據被銷毀
- 持久化存儲
- setMaxAge(int seconds)
- 正數:將Cookie數據寫到硬碟的文件中。持久化存儲。Cookie存活時間
- 負數:預設值
- 零:刪除Cookie信息
- setMaxAge(int seconds)
-
Cookie能不能存中文
- 在tomcat8之前不支持
- 在tomcat8之後支持
-
Cookie獲取範圍多大?
- 假設在一個tomcat伺服器中,部署了多個web項目,那麼能在這些web項目中Cookie能不能共用
- 預設情況下Cookie不能共用
- setPath(String path):設置cookie的獲取範圍。預設情況下,設置當前的虛擬目錄
- 如果要共用,則可以將path設置為"/"
- 不同的tomcat伺服器Cookie共用問題
- setDomain(String path):如果設置一級功能變數名稱相同,那麼多個伺服器之間的cookie可以共用
- setDomain(".baidu.com"),那麼tieba.baidu.com和news.baidu.com中cookies可以共用
- setDomain(String path):如果設置一級功能變數名稱相同,那麼多個伺服器之間的cookie可以共用
- 假設在一個tomcat伺服器中,部署了多個web項目,那麼能在這些web項目中Cookie能不能共用
-
Cookie的特點和作用
-
特點
- cookie存儲數據在客戶端瀏覽器
- 瀏覽器對於單個cookie的大小有限制(4kb),以及對同一個功能變數名稱下的總cookie數量也有限制(20個)
-
作用
- cookie一般用於存少量的不太敏感的數據
- 在不登錄的情況下,完成伺服器對客戶端的身份識別
-
-
案例:記住上一次訪問時間
-
需求:
- 訪問一個Servlet,如果是第一次訪問,則提示:你好,歡迎你首次訪問
- 如果不是第一次訪問,則提示:歡迎回來,您上次訪問的時間為:顯示時間字元串
-
分析
- 可以採用Cookie來完成
- 在伺服器中的Servlet判斷是否有一個名為lastTime的cookie
- 有:不是第一次訪問
- 沒有:是第一次訪問
- 響應數據:您好,歡迎首次訪問
- 寫回cookie:lastTime=xxxxx
-
代碼
public class CookieTest extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //設置響應的消息體的數據格式以及編碼 resp.setContentType("text/html;charset=utf-8"); //1.獲取所有cookie Cookie[] cookies = req.getCookies(); boolean flag = false;//沒有cookie為lastTime //2.遍歷cookies數組 if (cookies != null && cookies.length > 0){ for (Cookie cookie : cookies) { //3.獲取cookie的名稱 String name = cookie.getName(); //4.判斷名稱是否是lastTime if ("lastTime".equals(name)){ //有該cookie,不是第一次訪問 flag = true; //有lastTime的cookie //設置Cookie的value //獲取當前時間的字元串,重新設置cookie的值,重新發送cookie Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日 HH:MM:SS"); String str_date = sdf.format(date); System.out.println("編碼前"+str_date); //URL編碼 str_date = URLEncoder.encode(str_date,"utf-8"); System.out.println("編碼後"+str_date); //設置cookie的存活時間 cookie.setMaxAge(60*60*24*30);//一個月 resp.addCookie(cookie); //響應數據 //獲取cookie的value String value = cookie.getValue(); System.out.println("解碼前"+value); value = URLDecoder.decode(value,"utf-8"); System.out.println("解碼後"+value); resp.getWriter().write("<h1>歡迎回來,寧上次訪問的時間為:"+value+"</h1>"); break; } } } if(cookies == null || cookies.length == 0 || flag == false){ //沒有cookie,第一次訪問 //設置Cookie的value //獲取當前時間的字元串,重新設置cookie的值,重新發送cookie Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日 HH:MM:SS"); String str_date = sdf.format(date); System.out.println("編碼前"+str_date); //URL編碼 str_date = URLEncoder.encode(str_date,"utf-8"); System.out.println("編碼後"+str_date); Cookie cookie = new Cookie("lastTime",str_date); //設置cookie的存活時間 cookie.setMaxAge(60*60*24*30);//一個月 resp.addCookie(cookie); resp.getWriter().write("<h1>您好,歡迎你的首次訪問</h1>"); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req,resp); } }
-
-