JavaWeb學習筆記10-Cookie

上一篇:JavaWeb學習筆記09–Servlet(2)
下一篇:JavaWeb學習筆記11–Session

會話技術

    1. 會話:一次會話中包含多次請求和響應。
		* 一次會話:瀏覽器第一次給服務器資源發送請求,會話建立,直到有一方斷開爲止
	2. 功能:在一次會話的範圍內的多次請求間,共享數據
	3. 方式:
		1. 客戶端會話技術:Cookie
		2. 服務器端會話技術:Session

Cookie:

    1. 概念:客戶端會話技術,將數據保存到客戶端。
        Cookie是在瀏覽器訪問WEB服務器的某個資源時,由WEB服務器在HTTP響應消息頭中附帶傳送給瀏覽器的一個   小文本文件。 
        一旦WEB瀏覽器保存了某個Cookie,那麼它在以後每次訪問該WEB服務器時,都會在HTTP請求頭中將這個Cookie回傳給WEB服務器。
	2. 快速入門:
		* 使用步驟:
			1. 創建Cookie對象,綁定數據
				* new Cookie(String name, String value) 
			2. 發送Cookie對象
				* response.addCookie(Cookie cookie) 
			3. 獲取Cookie,拿到數據
				* Cookie[]  request.getCookies()  
    3.Cookie類的方法: 
          構造方法: public Cookie(String name,String value)
          獲取名稱: getName方法  
          獲取值: setValue與getValue方法   
          持久化存儲: setMaxAge與getMaxAge方法   
          共享數據: setPath與getPath方法 

	4. 實現方法和原理
		* 1.創建Cookie對象
		* 2.設置最大時效
		* 3.將Cookie放入到HTTP響應報頭
		如果創建了一個cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的cookie,存儲在瀏覽器的內存中,用戶退出瀏覽器之後被刪除。
	    若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,並給出一個以秒爲單位的時間。將最大時效設爲0則是命令瀏覽器刪除該cookie。
		發送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個SetCookieHTTP響應報頭中。由於這個方法並不修改任何之前指定的Set-Cookie報頭,而是創建新的報頭,因此將這個方法稱爲是addCookie,而非setCookie。
          
          
	5. cookie的細節
		1. 一次可不可以發送多個cookie?
			* 可以
			* 可以創建多個Cookie對象,使用response調用多次addCookie方法發送cookie即可。
			* 一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制爲4KB
		2. cookie在瀏覽器中保存多長時間?
			1. 默認情況下,當瀏覽器關閉後,Cookie數據被銷燬
			2. 持久化存儲:
				* setMaxAge(int seconds)
					1. 正數:將Cookie數據寫到硬盤的文件中。持久化存儲。並指定cookie存活時間,時間到後,cookie文件自動失效
					2. 負數:默認值
					3. 零:刪除cookie信息
		3. cookie能不能存中文?
			* 在tomcat 8 之前 cookie中不能直接存儲中文數據。
				* 需要將中文數據轉碼---一般採用URL編碼(%E3)
			* 在tomcat 8 之後,cookie支持中文數據。特殊字符還是不支持,建議使用URL編碼存儲,URL解碼解析
		4. cookie共享問題?
			1. 假設在一個tomcat服務器中,部署了多個web項目,那麼在這些web項目中cookie能不能共享?
				* 默認情況下cookie不能共享
				* setPath(String path):設置cookie的獲取範圍。默認情況下,設置當前的虛擬目錄
					* 如果要共享,則可以將path設置爲"/"

			2. 不同的tomcat服務器間cookie共享問題?
				* setDomain(String path):如果設置一級域名相同,那麼多個服務器之間cookie可以共享
					* setDomain(".baidu.com"),那麼tieba.baidu.com和news.baidu.com中cookie可以共享
			
	5. Cookie的特點和作用
		1. cookie存儲數據在客戶端瀏覽器
		2. 瀏覽器對於單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數量也有限制(20)

		* 作用:
			1. cookie一般用於存出少量的不太敏感的數據
			2. 在不登錄的情況下,完成服務器對客戶端的身份識別

記住上一次訪問時間:

        1. 需求:
			1. 訪問一個Servlet,如果是第一次訪問,則提示:您好,歡迎您首次訪問。
			2. 如果不是第一次訪問,則提示:歡迎回來,您上次訪問時間爲:顯示時間字符串

		2. 分析:
			1. 可以採用Cookie來完成
			2. 在服務器中的Servlet判斷是否有一個名爲lastTime的cookie
				1. 有:不是第一次訪問
					1. 響應數據:歡迎回來,您上次訪問時間爲:201861011:50:20
					2. 寫回Cookie:lastTime=201861011:50:01
				2. 沒有:是第一次訪問
					1. 響應數據:您好,歡迎您首次訪問
					2. 寫回Cookie:lastTime=201861011:50:01

代碼實現:

@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {	
	
    	//設置響應的消息體的數據格式以及編碼	
    	response.setContentType("text/html;charset=utf-8");		
	
    	//1.獲取所有Cookie	
    	Cookie[] cookies = request.getCookies();	
    	boolean flag = false;//沒有cookie爲lastTime	
    	//2.遍歷cookie數組	
    	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.setValue(str_date);				
    				//設置cookie的存活時間				
    				cookie.setMaxAge(60 * 60 * 24 * 30);//一個月				
    				response.addCookie(cookie);				
    				//響應數據				
    				//獲取Cookie的value,時間				
    				String value = cookie.getValue();				
    				System.out.println("解碼前:"+value);				
    				//URL解碼:				
    				value = URLDecoder.decode(value,"utf-8");				
    				System.out.println("解碼後:"+value);        				
    				response.getWriter().write("<h1>歡迎回來,您上次訪問時間爲:"+value+"</h1>");		        
				
    				break;		   
			
    			}   		
    		}	
    	}
			
    	if(cookies == null || cookies.length == 0 || flag == false){	
    		//沒有,第一次訪問	
    		//設置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);//一個月	
    		response.addCookie(cookie);	
    		response.getWriter().write("<h1>您好,歡迎您首次訪問</h1>");		
    	}
	
    }
		
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	this.doPost(request, response);	
    }

}



上一篇:JavaWeb學習筆記09–Servlet(2)
下一篇:JavaWeb學習筆記11–Session

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章